Skip to content

Commit 8d35f3d

Browse files
committed
feat(emmylua_ls): show progress percentage while indexing workspace
1 parent b3d565e commit 8d35f3d

File tree

2 files changed

+50
-12
lines changed
  • crates
    • emmylua_code_analysis/src
    • emmylua_ls/src/handlers/initialized

2 files changed

+50
-12
lines changed

crates/emmylua_code_analysis/src/lib.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,37 @@ impl EmmyLuaAnalysis {
156156
updated_files
157157
}
158158

159+
pub fn update_files_by_uri_with_progress<T: Fn(usize, usize)>(
160+
&mut self,
161+
files: Vec<(Uri, Option<String>)>,
162+
progress_callback: T,
163+
) -> Vec<FileId> {
164+
let mut removed_files = HashSet::new();
165+
let mut updated_files = HashSet::new();
166+
let total_count = files.len();
167+
{
168+
let _p = Profile::new("update files");
169+
for (idx, (uri, text)) in files.iter().enumerate() {
170+
let is_new_text = text.is_some();
171+
let file_id = self
172+
.compilation
173+
.get_db_mut()
174+
.get_vfs_mut()
175+
.set_file_content(&uri, text.clone());
176+
removed_files.insert(file_id);
177+
if is_new_text {
178+
updated_files.insert(file_id);
179+
}
180+
progress_callback(idx, total_count)
181+
}
182+
}
183+
self.compilation
184+
.remove_index(removed_files.into_iter().collect());
185+
let updated_files: Vec<FileId> = updated_files.into_iter().collect();
186+
self.compilation.update_index(updated_files.clone());
187+
updated_files
188+
}
189+
159190
#[allow(unused)]
160191
pub(crate) fn update_files_by_uri_sorted(
161192
&mut self,

crates/emmylua_ls/src/handlers/initialized/mod.rs

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ use crate::{
2020
pub use client_config::{ClientConfig, get_client_config};
2121
use codestyle::load_editorconfig;
2222
use collect_files::collect_files;
23-
use emmylua_code_analysis::{EmmyLuaAnalysis, Emmyrc, uri_to_file_path};
24-
use lsp_types::InitializeParams;
23+
use emmylua_code_analysis::{EmmyLuaAnalysis, Emmyrc, file_path_to_uri, uri_to_file_path};
24+
use lsp_types::{InitializeParams, Uri};
2525
use tokio::sync::RwLock;
2626

2727
pub async fn initialized_handler(
@@ -150,18 +150,25 @@ pub async fn init_analysis(
150150
);
151151

152152
// load files
153-
let files = collect_files(&workspace_folders, &emmyrc);
154-
let files: Vec<(PathBuf, Option<String>)> =
155-
files.into_iter().map(|file| file.into_tuple()).collect();
153+
let files: Vec<emmylua_code_analysis::LuaFileInfo> = collect_files(&workspace_folders, &emmyrc);
154+
let files: Vec<(Uri, Option<String>)> = files
155+
.into_iter()
156+
.filter_map(|file| {
157+
let (path, text) = file.into_tuple();
158+
let uri = file_path_to_uri(&path)?;
159+
Some((uri, text))
160+
})
161+
.collect();
156162
let file_count = files.len();
157163
if file_count != 0 {
158-
status_bar.update_progress_task(
159-
ProgressTask::LoadWorkspace,
160-
None,
161-
Some(format!("Indexing {} files", file_count)),
162-
);
163-
164-
mut_analysis.update_files_by_path(files);
164+
mut_analysis.update_files_by_uri_with_progress(files, |idx, total_count| {
165+
let percentage = (idx as u32) * 100 / (total_count as u32) + 1;
166+
status_bar.update_progress_task(
167+
ProgressTask::LoadWorkspace,
168+
Some(percentage.clamp(0, 100)),
169+
Some(format!("Indexing {} files", total_count)),
170+
);
171+
});
165172
}
166173

167174
status_bar.update_progress_task(

0 commit comments

Comments
 (0)