@@ -1,4 +1,4 @@
1−use helix_lsp::lsp;
1+use helix_lsp::{lsp, LspProgressMap};
2use helix_view::{document::Mode, Document, Editor, Theme, View};
2use helix_view::{document::Mode, Document, Editor, Theme, View};
4use crate::{args::Args, compositor::Compositor, config::Config, keymap::Keymaps, ui};
4use crate::{args::Args, compositor::Compositor, config::Config, keymap::Keymaps, ui};
@@ -9,6 +9,7 @@ use std::{
9 future::Future,
9 future::Future,
10 io::{self, stdout, Stdout, Write},
10 io::{self, stdout, Stdout, Write},
11 path::PathBuf,
11 path::PathBuf,
12 sync::Arc,
13 sync::Arc,
13 time::Duration,
14 time::Duration,
@@ -23,7 +24,6 @@ use crossterm::{
23use tui::layout::Rect;
24use tui::layout::Rect;
25use futures_util::stream::FuturesUnordered;
26use futures_util::stream::FuturesUnordered;
28type BoxFuture<T> = Pin<Box<dyn Future<Output = T> + Send>>;
28type BoxFuture<T> = Pin<Box<dyn Future<Output = T> + Send>>;
29pub type LspCallback =
29pub type LspCallback =
@@ -37,6 +37,8 @@ pub struct Application {
37 editor: Editor,
37 editor: Editor,
39 callbacks: LspCallbacks,
39 callbacks: LspCallbacks,
41+ lsp_progress: LspProgressMap,
42impl Application {
44impl Application {
@@ -74,6 +76,7 @@ impl Application {
76 callbacks: FuturesUnordered::new(),
78 callbacks: FuturesUnordered::new(),
79+ lsp_progress: LspProgressMap::new(),
@@ -246,55 +249,67 @@ impl Application {
246 log::warn!("unhandled window/logMessage: {:?}", params);
249 log::warn!("unhandled window/logMessage: {:?}", params);
248 Notification::ProgressMessage(params) => {
251 Notification::ProgressMessage(params) => {
249− let token = match params.token {
252+ let lsp::ProgressParams { token, value } = params;
250− lsp::NumberOrString::Number(n) => n.to_string(),
253+
251− lsp::NumberOrString::String(s) => s,
254− let lsp::ProgressParamsValue::WorkDone(work) = params.value;
254+ let lsp::ProgressParamsValue::WorkDone(work) = value;
255− let parts = match work {
255+ let parts = match &work {
256 lsp::WorkDoneProgress::Begin(lsp::WorkDoneProgressBegin {
256 lsp::WorkDoneProgress::Begin(lsp::WorkDoneProgressBegin {
259 percentage,
259 percentage,
261− }) => (Some(title), message, percentage.map(|n| n.to_string())),
261+ }) => (Some(title), message, percentage),
262 lsp::WorkDoneProgress::Report(lsp::WorkDoneProgressReport {
262 lsp::WorkDoneProgress::Report(lsp::WorkDoneProgressReport {
264 percentage,
264 percentage,
266− }) => (None, message, percentage.map(|n| n.to_string())),
266+ }) => (None, message, percentage),
267− lsp::WorkDoneProgress::End(lsp::WorkDoneProgressEnd {
267+ lsp::WorkDoneProgress::End(lsp::WorkDoneProgressEnd { message }) => {
270− if let Some(message) = message {
268+ if message.is_some() {
271− (None, Some(message), None)
269+ (None, message, &None)
271+ self.lsp_progress.end_progress(server_id, &token);
273 self.editor.clear_status();
272 self.editor.clear_status();
277+ let token_d: &dyn std::fmt::Display = match &token {
278+ lsp::NumberOrString::Number(n) => n,
279+ lsp::NumberOrString::String(s) => s,
278− match parts {
282+ let status = match parts {
279 (Some(title), Some(message), Some(percentage)) => {
283 (Some(title), Some(message), Some(percentage)) => {
280− format!("{}% {} - {}", percentage, title, message)
284+ format!("[{}] {}% {} - {}", token_d, percentage, title, message)
282 (Some(title), None, Some(percentage)) => {
286 (Some(title), None, Some(percentage)) => {
283− format!("{}% {}", percentage, title)
287+ format!("[{}] {}% {}", token_d, percentage, title)
285 (Some(title), Some(message), None) => {
289 (Some(title), Some(message), None) => {
286− format!("{} - {}", title, message)
290+ format!("[{}] {} - {}", token_d, title, message)
288 (None, Some(message), Some(percentage)) => {
292 (None, Some(message), Some(percentage)) => {
289− format!("{}% {}", percentage, message)
293+ format!("[{}] {}% {}", token_d, percentage, message)
291− (Some(title), None, None) => title,
295+ (Some(title), None, None) => {
296+ format!("[{}] {}", token_d, title)
292− (None, Some(message), None) => message,
298+ (None, Some(message), None) => {
299+ format!("[{}] {}", token_d, message)
293− (None, None, Some(percentage)) => format!("{}%", percentage),
301+ (None, None, Some(percentage)) => {
294− (None, None, None) => "".into(),
302+ format!("[{}] {}%", token_d, percentage)
304+ (None, None, None) => format!("[{}]", token_d),
297− let status = format!("[{}] {}", token, msg);
306+
307+ if let lsp::WorkDoneProgress::End(_) = work {
308+ self.lsp_progress.end_progress(server_id, &token);
310+ self.lsp_progress.update(server_id, token, work);
298 self.editor.set_status(status);
313 self.editor.set_status(status);
299 self.render();
314 self.render();