on master help sign in
Update handling of progress notification
commite1109a5a010d02b34c2a8f68726fcdae47d44f2d authorwojciechkepka <wojtek.kepka@protonmail.com> dateFri 18 Jun 2021, 05:43 (5 years ago) parent38cb934
1 file changed+41−26
helix-term/src/application.rs+41−26
helix-term/src/application.rs+41−26
@@ -1,4 +1,4 @@
1−use helix_lsp::lsp;
1+use helix_lsp::{lsp, LspProgressMap};
22use helix_view::{document::Mode, Document, Editor, Theme, View};
33
44use crate::{args::Args, compositor::Compositor, config::Config, keymap::Keymaps, ui};
@@ -9,6 +9,7 @@ use std::{
99 future::Future,
1010 io::{self, stdout, Stdout, Write},
1111 path::PathBuf,
12+ pin::Pin,
1213 sync::Arc,
1314 time::Duration,
1415};
@@ -23,7 +24,6 @@ use crossterm::{
2324use tui::layout::Rect;
2425
2526use futures_util::stream::FuturesUnordered;
26−use std::pin::Pin;
2727
2828type BoxFuture<T> = Pin<Box<dyn Future<Output = T> + Send>>;
2929pub type LspCallback =
@@ -37,6 +37,8 @@ pub struct Application {
3737 editor: Editor,
3838
3939 callbacks: LspCallbacks,
40+
41+ lsp_progress: LspProgressMap,
4042}
4143
4244impl Application {
@@ -74,6 +76,7 @@ impl Application {
7476 editor,
7577
7678 callbacks: FuturesUnordered::new(),
79+ lsp_progress: LspProgressMap::new(),
7780 };
7881
7982 Ok(app)
@@ -246,55 +249,67 @@ impl Application {
246249 log::warn!("unhandled window/logMessage: {:?}", params);
247250 }
248251 Notification::ProgressMessage(params) => {
249− let token = match params.token {
250− lsp::NumberOrString::Number(n) => n.to_string(),
251− lsp::NumberOrString::String(s) => s,
252− };
253− let msg = {
254− let lsp::ProgressParamsValue::WorkDone(work) = params.value;
255− let parts = match work {
252+ let lsp::ProgressParams { token, value } = params;
253+
254+ let lsp::ProgressParamsValue::WorkDone(work) = value;
255+ let parts = match &work {
256256 lsp::WorkDoneProgress::Begin(lsp::WorkDoneProgressBegin {
257257 title,
258258 message,
259259 percentage,
260260 ..
261− }) => (Some(title), message, percentage.map(|n| n.to_string())),
261+ }) => (Some(title), message, percentage),
262262 lsp::WorkDoneProgress::Report(lsp::WorkDoneProgressReport {
263263 message,
264264 percentage,
265265 ..
266− }) => (None, message, percentage.map(|n| n.to_string())),
267− lsp::WorkDoneProgress::End(lsp::WorkDoneProgressEnd {
268− message,
269− }) => {
270− if let Some(message) = message {
271− (None, Some(message), None)
266+ }) => (None, message, percentage),
267+ lsp::WorkDoneProgress::End(lsp::WorkDoneProgressEnd { message }) => {
268+ if message.is_some() {
269+ (None, message, &None)
272270 } else {
271+ self.lsp_progress.end_progress(server_id, &token);
273272 self.editor.clear_status();
274273 return;
275274 }
276275 }
277276 };
278− match parts {
277+ let token_d: &dyn std::fmt::Display = match &token {
278+ lsp::NumberOrString::Number(n) => n,
279+ lsp::NumberOrString::String(s) => s,
280+ };
281+
282+ let status = match parts {
279283 (Some(title), Some(message), Some(percentage)) => {
280− format!("{}% {} - {}", percentage, title, message)
284+ format!("[{}] {}% {} - {}", token_d, percentage, title, message)
281285 }
282286 (Some(title), None, Some(percentage)) => {
283− format!("{}% {}", percentage, title)
287+ format!("[{}] {}% {}", token_d, percentage, title)
284288 }
285289 (Some(title), Some(message), None) => {
286− format!("{} - {}", title, message)
290+ format!("[{}] {} - {}", token_d, title, message)
287291 }
288292 (None, Some(message), Some(percentage)) => {
289− format!("{}% {}", percentage, message)
293+ format!("[{}] {}% {}", token_d, percentage, message)
290294 }
291− (Some(title), None, None) => title,
292− (None, Some(message), None) => message,
293− (None, None, Some(percentage)) => format!("{}%", percentage),
294− (None, None, None) => "".into(),
295+ (Some(title), None, None) => {
296+ format!("[{}] {}", token_d, title)
297+ }
298+ (None, Some(message), None) => {
299+ format!("[{}] {}", token_d, message)
300+ }
301+ (None, None, Some(percentage)) => {
302+ format!("[{}] {}%", token_d, percentage)
295303 }
304+ (None, None, None) => format!("[{}]", token_d),
296305 };
297− let status = format!("[{}] {}", token, msg);
306+
307+ if let lsp::WorkDoneProgress::End(_) = work {
308+ self.lsp_progress.end_progress(server_id, &token);
309+ } else {
310+ self.lsp_progress.update(server_id, token, work);
311+ }
312+
298313 self.editor.set_status(status);
299314 self.render();
300315 }