mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-01 23:12:02 +00:00
Make flycheck workdone progress reports cancellable
This commit is contained in:
parent
40cbeb5b3d
commit
e41023ce46
@ -87,6 +87,7 @@ impl GlobalState {
|
||||
state: Progress,
|
||||
message: Option<String>,
|
||||
fraction: Option<f64>,
|
||||
cancel_token: Option<String>,
|
||||
) {
|
||||
if !self.config.work_done_progress() {
|
||||
return;
|
||||
@ -95,7 +96,10 @@ impl GlobalState {
|
||||
assert!((0.0..=1.0).contains(&f));
|
||||
(f * 100.0) as u32
|
||||
});
|
||||
let token = lsp_types::ProgressToken::String(format!("rustAnalyzer/{}", title));
|
||||
let cancellable = Some(cancel_token.is_some());
|
||||
let token = lsp_types::ProgressToken::String(
|
||||
cancel_token.unwrap_or_else(|| format!("rustAnalyzer/{}", title)),
|
||||
);
|
||||
let work_done_progress = match state {
|
||||
Progress::Begin => {
|
||||
self.send_request::<lsp_types::request::WorkDoneProgressCreate>(
|
||||
@ -105,14 +109,14 @@ impl GlobalState {
|
||||
|
||||
lsp_types::WorkDoneProgress::Begin(lsp_types::WorkDoneProgressBegin {
|
||||
title: title.into(),
|
||||
cancellable: None,
|
||||
cancellable,
|
||||
message,
|
||||
percentage,
|
||||
})
|
||||
}
|
||||
Progress::Report => {
|
||||
lsp_types::WorkDoneProgress::Report(lsp_types::WorkDoneProgressReport {
|
||||
cancellable: None,
|
||||
cancellable,
|
||||
message,
|
||||
percentage,
|
||||
})
|
||||
|
@ -257,7 +257,7 @@ impl GlobalState {
|
||||
}
|
||||
};
|
||||
|
||||
self.report_progress("Indexing", state, message, Some(fraction));
|
||||
self.report_progress("Indexing", state, message, Some(fraction), None);
|
||||
}
|
||||
}
|
||||
Event::Vfs(message) => {
|
||||
@ -465,7 +465,7 @@ impl GlobalState {
|
||||
}
|
||||
};
|
||||
|
||||
self.report_progress("Fetching", state, msg, None);
|
||||
self.report_progress("Fetching", state, msg, None, None);
|
||||
}
|
||||
Task::FetchBuildData(progress) => {
|
||||
let (state, msg) = match progress {
|
||||
@ -481,7 +481,7 @@ impl GlobalState {
|
||||
};
|
||||
|
||||
if let Some(state) = state {
|
||||
self.report_progress("Loading", state, msg, None);
|
||||
self.report_progress("Loading", state, msg, None, None);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -518,6 +518,7 @@ impl GlobalState {
|
||||
state,
|
||||
Some(format!("{}/{}", n_done, n_total)),
|
||||
Some(Progress::fraction(n_done, n_total)),
|
||||
None,
|
||||
)
|
||||
}
|
||||
}
|
||||
@ -584,7 +585,13 @@ impl GlobalState {
|
||||
} else {
|
||||
format!("cargo check (#{})", id + 1)
|
||||
};
|
||||
self.report_progress(&title, state, message, None);
|
||||
self.report_progress(
|
||||
&title,
|
||||
state,
|
||||
message,
|
||||
None,
|
||||
Some(format!("rust-analyzer/checkOnSave/{}", id)),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -698,7 +705,16 @@ impl GlobalState {
|
||||
this.cancel(id);
|
||||
Ok(())
|
||||
})?
|
||||
.on::<lsp_types::notification::WorkDoneProgressCancel>(|_this, _params| {
|
||||
.on::<lsp_types::notification::WorkDoneProgressCancel>(|this, params| {
|
||||
if let lsp_types::NumberOrString::String(s) = ¶ms.token {
|
||||
if let Some(id) = s.strip_prefix("rust-analyzer/checkOnSave/") {
|
||||
if let Ok(id) = u32::from_str_radix(id, 10) {
|
||||
if let Some(flycheck) = this.flycheck.get(id as usize) {
|
||||
flycheck.cancel();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// Just ignore this. It is OK to continue sending progress
|
||||
// notifications for this token, as the client can't know when
|
||||
// we accepted notification.
|
||||
|
Loading…
Reference in New Issue
Block a user