diff --git a/crates/emmylua_code_analysis/src/lib.rs b/crates/emmylua_code_analysis/src/lib.rs index 6f619960f..02b8a407c 100644 --- a/crates/emmylua_code_analysis/src/lib.rs +++ b/crates/emmylua_code_analysis/src/lib.rs @@ -156,6 +156,37 @@ impl EmmyLuaAnalysis { updated_files } + pub fn update_files_by_uri_with_progress( + &mut self, + files: Vec<(Uri, Option)>, + progress_callback: T, + ) -> Vec { + let mut removed_files = HashSet::new(); + let mut updated_files = HashSet::new(); + let total_count = files.len(); + { + let _p = Profile::new("update files"); + for (idx, (uri, text)) in files.iter().enumerate() { + let is_new_text = text.is_some(); + let file_id = self + .compilation + .get_db_mut() + .get_vfs_mut() + .set_file_content(&uri, text.clone()); + removed_files.insert(file_id); + if is_new_text { + updated_files.insert(file_id); + } + progress_callback(idx, total_count) + } + } + self.compilation + .remove_index(removed_files.into_iter().collect()); + let updated_files: Vec = updated_files.into_iter().collect(); + self.compilation.update_index(updated_files.clone()); + updated_files + } + #[allow(unused)] pub(crate) fn update_files_by_uri_sorted( &mut self, diff --git a/crates/emmylua_ls/src/handlers/initialized/mod.rs b/crates/emmylua_ls/src/handlers/initialized/mod.rs index a84869079..41af5e19a 100644 --- a/crates/emmylua_ls/src/handlers/initialized/mod.rs +++ b/crates/emmylua_ls/src/handlers/initialized/mod.rs @@ -20,8 +20,8 @@ use crate::{ pub use client_config::{ClientConfig, get_client_config}; use codestyle::load_editorconfig; use collect_files::collect_files; -use emmylua_code_analysis::{EmmyLuaAnalysis, Emmyrc, uri_to_file_path}; -use lsp_types::InitializeParams; +use emmylua_code_analysis::{EmmyLuaAnalysis, Emmyrc, file_path_to_uri, uri_to_file_path}; +use lsp_types::{InitializeParams, Uri}; use tokio::sync::RwLock; pub async fn initialized_handler( @@ -150,18 +150,25 @@ pub async fn init_analysis( ); // load files - let files = collect_files(&workspace_folders, &emmyrc); - let files: Vec<(PathBuf, Option)> = - files.into_iter().map(|file| file.into_tuple()).collect(); + let files: Vec = collect_files(&workspace_folders, &emmyrc); + let files: Vec<(Uri, Option)> = files + .into_iter() + .filter_map(|file| { + let (path, text) = file.into_tuple(); + let uri = file_path_to_uri(&path)?; + Some((uri, text)) + }) + .collect(); let file_count = files.len(); if file_count != 0 { - status_bar.update_progress_task( - ProgressTask::LoadWorkspace, - None, - Some(format!("Indexing {} files", file_count)), - ); - - mut_analysis.update_files_by_path(files); + mut_analysis.update_files_by_uri_with_progress(files, |idx, total_count| { + let percentage = (idx as u32) * 100 / (total_count as u32) + 1; + status_bar.update_progress_task( + ProgressTask::LoadWorkspace, + Some(percentage.clamp(0, 100)), + Some(format!("Indexing {} files", total_count)), + ); + }); } status_bar.update_progress_task(