mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-29 06:23:25 +00:00
Auto merge of #17248 - mladedav:dm/delay-clear, r=Veykril
Clear diagnostics only after new ones were received Closes #15934 This adds a flag inside the global state which controls when old diagnostics are cleared. Now, old diagnostics should be cleared only after at least one new diagnostic is available.
This commit is contained in:
commit
2dc22c658a
2 changed files with 10 additions and 1 deletions
|
@ -87,6 +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,
|
||||||
|
|
||||||
// Test explorer
|
// Test explorer
|
||||||
pub(crate) test_run_session: Option<Vec<flycheck::CargoTestHandle>>,
|
pub(crate) test_run_session: Option<Vec<flycheck::CargoTestHandle>>,
|
||||||
|
@ -224,6 +225,7 @@ impl GlobalState {
|
||||||
flycheck_sender,
|
flycheck_sender,
|
||||||
flycheck_receiver,
|
flycheck_receiver,
|
||||||
last_flycheck_error: None,
|
last_flycheck_error: None,
|
||||||
|
diagnostics_received: false,
|
||||||
|
|
||||||
test_run_session: None,
|
test_run_session: None,
|
||||||
test_run_sender,
|
test_run_sender,
|
||||||
|
|
|
@ -804,6 +804,10 @@ 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 {
|
||||||
|
self.diagnostics.clear_check(id);
|
||||||
|
self.diagnostics_received = 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(
|
||||||
&self.config.diagnostics_map(),
|
&self.config.diagnostics_map(),
|
||||||
|
@ -832,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.clear_check(id);
|
self.diagnostics_received = false;
|
||||||
(Progress::Begin, None)
|
(Progress::Begin, None)
|
||||||
}
|
}
|
||||||
flycheck::Progress::DidCheckCrate(target) => (Progress::Report, Some(target)),
|
flycheck::Progress::DidCheckCrate(target) => (Progress::Report, Some(target)),
|
||||||
|
@ -848,6 +852,9 @@ 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 {
|
||||||
|
self.diagnostics.clear_check(id);
|
||||||
|
}
|
||||||
(Progress::End, None)
|
(Progress::End, None)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue