From 6219142c96708d8068bcf9eb2a6424882d74094c Mon Sep 17 00:00:00 2001
From: Aleksey Kladov <aleksey.kladov@gmail.com>
Date: Wed, 7 Oct 2020 12:15:37 +0200
Subject: Better progress API

Percentage is a UI concern, the physical fact here is fraction. It's
sad that percentage bleeds into the protocol level, we even duplicated
this bad API ourselves!
---
 crates/rust-analyzer/src/lsp_utils.rs | 11 ++++++++---
 crates/rust-analyzer/src/main_loop.rs |  2 +-
 2 files changed, 9 insertions(+), 4 deletions(-)

(limited to 'crates')

diff --git a/crates/rust-analyzer/src/lsp_utils.rs b/crates/rust-analyzer/src/lsp_utils.rs
index 85c661571..bd888f634 100644
--- a/crates/rust-analyzer/src/lsp_utils.rs
+++ b/crates/rust-analyzer/src/lsp_utils.rs
@@ -25,8 +25,9 @@ pub(crate) enum Progress {
 }
 
 impl Progress {
-    pub(crate) fn percentage(done: usize, total: usize) -> f64 {
-        (done as f64 / total.max(1) as f64) * 100.0
+    pub(crate) fn fraction(done: usize, total: usize) -> f64 {
+        assert!(done <= total);
+        done as f64 / total.max(1) as f64
     }
 }
 
@@ -43,11 +44,15 @@ impl GlobalState {
         title: &str,
         state: Progress,
         message: Option<String>,
-        percentage: Option<f64>,
+        fraction: Option<f64>,
     ) {
         if !self.config.client_caps.work_done_progress {
             return;
         }
+        let percentage = fraction.map(|f| {
+            assert!(0.0 <= f && f <= 1.0);
+            f * 100.0
+        });
         let token = lsp_types::ProgressToken::String(format!("rustAnalyzer/{}", title));
         let work_done_progress = match state {
             Progress::Begin => {
diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs
index c2d0ac791..4b7ac8224 100644
--- a/crates/rust-analyzer/src/main_loop.rs
+++ b/crates/rust-analyzer/src/main_loop.rs
@@ -230,7 +230,7 @@ impl GlobalState {
                                     "roots scanned",
                                     state,
                                     Some(format!("{}/{}", n_done, n_total)),
-                                    Some(Progress::percentage(n_done, n_total)),
+                                    Some(Progress::fraction(n_done, n_total)),
                                 )
                             }
                         }
-- 
cgit v1.2.3