Skip to content

Commit 9464063

Browse files
committed
add more logs, fix deadlock for neovim
1 parent 5e7c78e commit 9464063

File tree

5 files changed

+70
-27
lines changed

5 files changed

+70
-27
lines changed

crates/emmylua_ls/src/context/workspace_manager.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::collections::HashSet;
22
use std::path::Path;
3+
use std::sync::atomic::AtomicBool;
34
use std::{path::PathBuf, sync::Arc, time::Duration};
45

56
use super::{ClientProxy, FileDiagnostic, StatusBar};
@@ -24,6 +25,8 @@ pub struct WorkspaceManager {
2425
pub watcher: Option<notify::RecommendedWatcher>,
2526
pub current_open_files: HashSet<Uri>,
2627
pub match_file_pattern: WorkspaceFileMatcher,
28+
// 原子变量
29+
pub workspace_initialized: Arc<AtomicBool>,
2730
}
2831

2932
impl WorkspaceManager {
@@ -44,9 +47,20 @@ impl WorkspaceManager {
4447
watcher: None,
4548
current_open_files: HashSet::new(),
4649
match_file_pattern: WorkspaceFileMatcher::default(),
50+
workspace_initialized: Arc::new(AtomicBool::new(false)),
4751
}
4852
}
4953

54+
pub fn is_workspace_initialized(&self) -> bool {
55+
self.workspace_initialized
56+
.load(std::sync::atomic::Ordering::SeqCst)
57+
}
58+
59+
pub fn set_workspace_initialized(&self) {
60+
self.workspace_initialized
61+
.store(true, std::sync::atomic::Ordering::SeqCst);
62+
}
63+
5064
pub async fn add_update_emmyrc_task(&self, file_dir: PathBuf) {
5165
let mut update_token = self.update_token.lock().await;
5266
if let Some(token) = update_token.as_ref() {
@@ -139,6 +153,7 @@ impl WorkspaceManager {
139153
}
140154

141155
pub async fn reindex_workspace(&self, delay: Duration) -> Option<()> {
156+
log::info!("reindex workspace with delay: {:?}", delay);
142157
let mut update_token = self.update_token.lock().await;
143158
if let Some(token) = update_token.as_ref() {
144159
token.cancel();
@@ -274,6 +289,7 @@ pub fn load_emmy_config(config_root: Option<PathBuf>, client_config: ClientConfi
274289
emmyrc.pre_process_emmyrc(workspace_root);
275290
}
276291

292+
log::info!("loaded emmyrc complete");
277293
emmyrc.into()
278294
}
279295

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,23 @@ pub async fn on_did_change_configuration(
1111
let pretty_json = serde_json::to_string_pretty(&params).ok()?;
1212
log::info!("on_did_change_configuration: {}", pretty_json);
1313

14-
let config_manager = context.workspace_manager.read().await;
15-
if config_manager.client_config.client_id.is_vscode() {
14+
let workspace_manager = context.workspace_manager.read().await;
15+
if !workspace_manager.is_workspace_initialized() {
1616
return Some(());
1717
}
18-
let client_id = config_manager.client_config.client_id;
19-
drop(config_manager);
2018

19+
if workspace_manager.client_config.client_id.is_vscode() {
20+
return Some(());
21+
}
22+
let client_id = workspace_manager.client_config.client_id;
23+
drop(workspace_manager);
24+
25+
log::info!("change config client_id: {:?}", client_id);
2126
let new_client_config = get_client_config(&context, client_id).await;
2227
let mut config_manager = context.workspace_manager.write().await;
2328
config_manager.client_config = new_client_config;
2429

30+
log::info!("reloading workspace folders");
2531
config_manager.reload_workspace().await;
2632
Some(())
2733
}

crates/emmylua_ls/src/handlers/initialized/client_config/neovim_config.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@ pub async fn get_client_config_neovim(
1818
.await
1919
.workspace_folders
2020
.clone();
21-
let main_workspace_folder = workspace_folders.get(0);
21+
22+
let main_workspace_folder = workspace_folders.get(0)?;
2223
let client = &context.client;
23-
let scope_uri = main_workspace_folder.map(|p| file_path_to_uri(p).unwrap());
24+
let scope_uri = file_path_to_uri(main_workspace_folder);
2425
let params = lsp_types::ConfigurationParams {
2526
items: vec![lsp_types::ConfigurationItem {
2627
scope_uri: scope_uri,
@@ -37,9 +38,10 @@ pub async fn get_client_config_neovim(
3738

3839
if let Some(pretty_json) = serde_json::to_string_pretty(&configs).ok() {
3940
info!("load neovim client config: {}", pretty_json);
41+
} else {
42+
info!("not found neovim client config");
4043
}
4144

4245
config.partial_emmyrcs = Some(configs);
43-
4446
Some(())
4547
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ pub fn load_editorconfig(workspace_folders: Vec<PathBuf>) -> Option<()> {
4343
let file_normalized = file.to_string_lossy().to_string().replace("\\", "/");
4444
update_code_style(&parent_dir, &file_normalized);
4545
}
46+
log::info!("loaded editorconfig complete");
4647

4748
Some(())
4849
}

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

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ pub use client_config::{ClientConfig, get_client_config};
2121
use codestyle::load_editorconfig;
2222
use collect_files::collect_files;
2323
use emmylua_code_analysis::{EmmyLuaAnalysis, Emmyrc, uri_to_file_path};
24-
use log::info;
2524
use lsp_types::InitializeParams;
2625
use tokio::sync::RwLock;
2726

@@ -30,21 +29,33 @@ pub async fn initialized_handler(
3029
params: InitializeParams,
3130
cmd_args: CmdArgs,
3231
) -> Option<()> {
33-
let client_id = get_client_id(&params.client_info);
34-
let client_config = get_client_config(&context, client_id).await;
32+
// init locale
33+
locale::set_ls_locale(&params);
3534
let workspace_folders = get_workspace_folders(&params);
3635
let main_root: Option<&str> = match workspace_folders.first() {
3736
Some(path) => path.to_str(),
3837
None => None,
3938
};
40-
// init locale
41-
locale::set_ls_locale(&params);
4239

4340
// init logger
4441
init_logger(main_root, &cmd_args);
45-
info!("client_id: {:?}", client_id);
42+
log::info!("main root: {:?}", main_root);
43+
44+
let client_id = get_client_id(&params.client_info);
45+
log::info!("client_id: {:?}", client_id);
46+
47+
{
48+
log::info!("set workspace folders: {:?}", workspace_folders);
49+
let mut workspace_manager = context.workspace_manager.write().await;
50+
workspace_manager.workspace_folders = workspace_folders.clone();
51+
log::info!("workspace folders set");
52+
}
53+
54+
let client_config = get_client_config(&context, client_id).await;
55+
log::info!("client_config: {:?}", client_config);
56+
4657
let params_json = serde_json::to_string_pretty(&params).unwrap();
47-
info!("initialization_params: {}", params_json);
58+
log::info!("initialization_params: {}", params_json);
4859

4960
// init config
5061
// todo! support multi config
@@ -59,25 +70,26 @@ pub async fn initialized_handler(
5970
// init std lib
6071
init_std_lib(context.analysis.clone(), &cmd_args, emmyrc.clone()).await;
6172

62-
let mut workspace_manager = context.workspace_manager.write().await;
63-
workspace_manager.workspace_folders = workspace_folders.clone();
64-
workspace_manager.client_config = client_config.clone();
65-
let (include, exclude, exclude_dir) = calculate_include_and_exclude(&emmyrc);
66-
workspace_manager.match_file_pattern = WorkspaceFileMatcher::new(include, exclude, exclude_dir);
67-
drop(workspace_manager);
68-
// let file_diagnostic = context.file_diagnostic.clone();
69-
7073
init_analysis(
7174
context.analysis.clone(),
7275
context.client.clone(),
7376
&context.status_bar,
7477
workspace_folders,
75-
emmyrc,
78+
emmyrc.clone(),
7679
client_id,
7780
context.file_diagnostic.clone(),
7881
)
7982
.await;
8083

84+
{
85+
let mut workspace_manager = context.workspace_manager.write().await;
86+
workspace_manager.client_config = client_config.clone();
87+
let (include, exclude, exclude_dir) = calculate_include_and_exclude(&emmyrc);
88+
workspace_manager.match_file_pattern =
89+
WorkspaceFileMatcher::new(include, exclude, exclude_dir);
90+
workspace_manager.set_workspace_initialized();
91+
log::info!("workspace manager initialized");
92+
}
8193
register_files_watch(context.clone(), &params.capabilities).await;
8294
Some(())
8395
}
@@ -97,7 +109,7 @@ pub async fn init_analysis(
97109
mut_analysis.update_config(emmyrc.clone());
98110

99111
if let Ok(emmyrc_json) = serde_json::to_string_pretty(emmyrc.as_ref()) {
100-
info!("current config : {}", emmyrc_json);
112+
log::info!("current config : {}", emmyrc_json);
101113
}
102114

103115
status_bar.create_progress_task(client_id, ProgressTask::LoadWorkspace);
@@ -110,17 +122,17 @@ pub async fn init_analysis(
110122

111123
let mut workspace_folders = workspace_folders;
112124
for workspace_root in &workspace_folders {
113-
info!("add workspace root: {:?}", workspace_root);
125+
log::info!("add workspace root: {:?}", workspace_root);
114126
mut_analysis.add_main_workspace(workspace_root.clone());
115127
}
116128

117129
for workspace_root in &emmyrc.workspace.workspace_roots {
118-
info!("add workspace root: {:?}", workspace_root);
130+
log::info!("add workspace root: {:?}", workspace_root);
119131
mut_analysis.add_main_workspace(PathBuf::from_str(workspace_root).unwrap());
120132
}
121133

122134
for lib in &emmyrc.workspace.library {
123-
info!("add library: {:?}", lib);
135+
log::info!("add library: {:?}", lib);
124136
mut_analysis.add_library_workspace(PathBuf::from_str(lib).unwrap());
125137
workspace_folders.push(PathBuf::from_str(lib).unwrap());
126138
}
@@ -190,10 +202,16 @@ pub async fn init_std_lib(
190202
cmd_args: &CmdArgs,
191203
emmyrc: Arc<Emmyrc>,
192204
) {
205+
log::info!(
206+
"initializing std lib with resources path: {:?}",
207+
cmd_args.resources_path
208+
);
193209
let mut analysis = analysis.write().await;
194210
if cmd_args.load_stdlib.0 {
195211
// double update config
196212
analysis.update_config(emmyrc);
197213
analysis.init_std_lib(cmd_args.resources_path.0.clone());
198214
}
215+
216+
log::info!("initialized std lib complete");
199217
}

0 commit comments

Comments
 (0)