fix diagnostics clearing when flychecks run per-workspace

This commit is contained in:
David Mládek 2024-05-28 11:07:57 +02:00
parent c1b051602c
commit eeda60ddd8
2 changed files with 6 additions and 6 deletions

View File

@ -87,7 +87,7 @@ pub(crate) struct GlobalState {
pub(crate) flycheck_sender: Sender<flycheck::Message>, pub(crate) flycheck_sender: Sender<flycheck::Message>,
pub(crate) flycheck_receiver: Receiver<flycheck::Message>, pub(crate) flycheck_receiver: Receiver<flycheck::Message>,
pub(crate) last_flycheck_error: Option<String>, pub(crate) last_flycheck_error: Option<String>,
pub(crate) diagnostics_received: bool, pub(crate) diagnostics_received: FxHashMap<usize, bool>,
// Test explorer // Test explorer
pub(crate) test_run_session: Option<Vec<flycheck::CargoTestHandle>>, pub(crate) test_run_session: Option<Vec<flycheck::CargoTestHandle>>,
@ -225,7 +225,7 @@ impl GlobalState {
flycheck_sender, flycheck_sender,
flycheck_receiver, flycheck_receiver,
last_flycheck_error: None, last_flycheck_error: None,
diagnostics_received: false, diagnostics_received: FxHashMap::default(),
test_run_session: None, test_run_session: None,
test_run_sender, test_run_sender,

View File

@ -804,9 +804,9 @@ impl GlobalState {
fn handle_flycheck_msg(&mut self, message: flycheck::Message) { fn handle_flycheck_msg(&mut self, message: flycheck::Message) {
match message { match message {
flycheck::Message::AddDiagnostic { id, workspace_root, diagnostic } => { flycheck::Message::AddDiagnostic { id, workspace_root, diagnostic } => {
if !self.diagnostics_received { if !self.diagnostics_received.get(&id).copied().unwrap_or_default() {
self.diagnostics.clear_check(id); self.diagnostics.clear_check(id);
self.diagnostics_received = true; self.diagnostics_received.insert(id, true);
} }
let snap = self.snapshot(); let snap = self.snapshot();
let diagnostics = crate::diagnostics::to_proto::map_rust_diagnostic_to_lsp( let diagnostics = crate::diagnostics::to_proto::map_rust_diagnostic_to_lsp(
@ -836,7 +836,7 @@ impl GlobalState {
flycheck::Message::Progress { id, progress } => { flycheck::Message::Progress { id, progress } => {
let (state, message) = match progress { let (state, message) = match progress {
flycheck::Progress::DidStart => { flycheck::Progress::DidStart => {
self.diagnostics_received = false; self.diagnostics_received.insert(id, false);
(Progress::Begin, None) (Progress::Begin, None)
} }
flycheck::Progress::DidCheckCrate(target) => (Progress::Report, Some(target)), flycheck::Progress::DidCheckCrate(target) => (Progress::Report, Some(target)),
@ -852,7 +852,7 @@ impl GlobalState {
flycheck::Progress::DidFinish(result) => { flycheck::Progress::DidFinish(result) => {
self.last_flycheck_error = self.last_flycheck_error =
result.err().map(|err| format!("cargo check failed to start: {err}")); result.err().map(|err| format!("cargo check failed to start: {err}"));
if !self.diagnostics_received { if !self.diagnostics_received.get(&id).copied().unwrap_or_default() {
self.diagnostics.clear_check(id); self.diagnostics.clear_check(id);
} }
(Progress::End, None) (Progress::End, None)