Skip to content

Commit 3bee194

Browse files
committed
Save capabilities to ServerContext, check them when loading configs
1 parent 9acef3a commit 3bee194

File tree

6 files changed

+42
-14
lines changed

6 files changed

+42
-14
lines changed

crates/emmylua_ls/src/context/mod.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ pub use client_id::{ClientId, get_client_id};
1010
use emmylua_code_analysis::EmmyLuaAnalysis;
1111
pub use file_diagnostic::FileDiagnostic;
1212
use lsp_server::{Connection, ErrorCode, Message, RequestId, Response};
13+
use lsp_types::ClientCapabilities;
1314
pub use snapshot::ServerContextSnapshot;
1415
pub use status_bar::ProgressTask;
1516
pub use status_bar::StatusBar;
@@ -29,10 +30,11 @@ pub struct ServerContext {
2930
file_diagnostic: Arc<FileDiagnostic>,
3031
workspace_manager: Arc<RwLock<WorkspaceManager>>,
3132
status_bar: Arc<StatusBar>,
33+
client_capabilities: Arc<ClientCapabilities>,
3234
}
3335

3436
impl ServerContext {
35-
pub fn new(conn: Connection) -> Self {
37+
pub fn new(conn: Connection, client_capabilities: Arc<ClientCapabilities>) -> Self {
3638
let client = Arc::new(ClientProxy::new(Connection {
3739
sender: conn.sender.clone(),
3840
receiver: conn.receiver.clone(),
@@ -60,6 +62,7 @@ impl ServerContext {
6062
cancllations: Arc::new(Mutex::new(HashMap::new())),
6163
workspace_manager,
6264
status_bar,
65+
client_capabilities,
6366
}
6467
}
6568

@@ -70,6 +73,7 @@ impl ServerContext {
7073
file_diagnostic: self.file_diagnostic.clone(),
7174
workspace_manager: self.workspace_manager.clone(),
7275
status_bar: self.status_bar.clone(),
76+
client_capabilities: self.client_capabilities.clone(),
7377
}
7478
}
7579

crates/emmylua_ls/src/context/snapshot.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use lsp_types::ClientCapabilities;
12
use std::sync::Arc;
23
use tokio::sync::RwLock;
34

@@ -15,4 +16,5 @@ pub struct ServerContextSnapshot {
1516
pub file_diagnostic: Arc<FileDiagnostic>,
1617
pub workspace_manager: Arc<RwLock<WorkspaceManager>>,
1718
pub status_bar: Arc<StatusBar>,
19+
pub client_capabilities: Arc<ClientCapabilities>,
1820
}

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,15 @@ pub async fn on_did_change_configuration(
2222
let client_id = workspace_manager.client_config.client_id;
2323
drop(workspace_manager);
2424

25+
let supports_config_request = context
26+
.client_capabilities
27+
.workspace
28+
.as_ref()?
29+
.configuration
30+
.unwrap_or_default();
31+
2532
log::info!("change config client_id: {:?}", client_id);
26-
let new_client_config = get_client_config(&context, client_id).await;
33+
let new_client_config = get_client_config(&context, client_id, supports_config_request).await;
2734
let mut config_manager = context.workspace_manager.write().await;
2835
config_manager.client_config = new_client_config;
2936

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ pub struct ClientConfig {
2020
pub async fn get_client_config(
2121
context: &ServerContextSnapshot,
2222
client_id: ClientId,
23+
supports_config_request: bool,
2324
) -> ClientConfig {
2425
let mut config = ClientConfig {
2526
client_id,
@@ -29,11 +30,16 @@ pub async fn get_client_config(
2930
partial_emmyrcs: None,
3031
};
3132
match client_id {
32-
ClientId::VSCode => get_client_config_vscode(context, &mut config).await,
33+
ClientId::VSCode => {
34+
get_client_config_vscode(context, &mut config).await;
35+
}
3336
ClientId::Neovim => {
34-
get_client_config_default(context, &mut config, Some(&["Lua", "emmylua"])).await
37+
get_client_config_default(context, &mut config, Some(&["Lua", "emmylua"])).await;
38+
}
39+
_ if supports_config_request => {
40+
get_client_config_default(context, &mut config, None).await;
3541
}
36-
_ => get_client_config_default(context, &mut config, None).await,
42+
_ => {}
3743
};
3844

3945
config

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ pub async fn initialized_handler(
4242
log::info!("main root: {:?}", main_root);
4343

4444
let client_id = get_client_id(&params.client_info);
45+
let supports_config_request = params
46+
.capabilities
47+
.workspace
48+
.as_ref()?
49+
.configuration
50+
.unwrap_or_default();
4551
log::info!("client_id: {:?}", client_id);
4652

4753
{
@@ -51,7 +57,7 @@ pub async fn initialized_handler(
5157
log::info!("workspace folders set");
5258
}
5359

54-
let client_config = get_client_config(&context, client_id).await;
60+
let client_config = get_client_config(&context, client_id, supports_config_request).await;
5561
log::info!("client_config: {:?}", client_config);
5662

5763
let params_json = serde_json::to_string_pretty(&params).unwrap();

crates/emmylua_ls/src/lib.rs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,17 @@ mod logger;
55
mod meta_text;
66
mod util;
77

8+
use crate::handlers::{
9+
initialized_handler, on_notification_handler, on_req_handler, on_response_handler,
10+
};
811
pub use clap::Parser;
912
pub use cmd_args::*;
1013
use handlers::server_capabilities;
1114
use lsp_server::{Connection, Message};
1215
use lsp_types::InitializeParams;
16+
use std::sync::Arc;
1317
use std::{env, error::Error};
1418

15-
use crate::handlers::{
16-
initialized_handler, on_notification_handler, on_req_handler, on_response_handler,
17-
};
18-
1919
#[macro_use]
2020
extern crate rust_i18n;
2121
rust_i18n::i18n!("./locales", fallback = "en");
@@ -60,10 +60,13 @@ async fn main_loop(
6060
params: InitializeParams,
6161
cmd_args: CmdArgs,
6262
) -> Result<(), Box<dyn Error + Sync + Send>> {
63-
let mut server_context = context::ServerContext::new(Connection {
64-
sender: connection.sender.clone(),
65-
receiver: connection.receiver.clone(),
66-
});
63+
let mut server_context = context::ServerContext::new(
64+
Connection {
65+
sender: connection.sender.clone(),
66+
receiver: connection.receiver.clone(),
67+
},
68+
Arc::new(params.capabilities.clone()),
69+
);
6770

6871
let server_context_snapshot = server_context.snapshot();
6972
tokio::spawn(async move {

0 commit comments

Comments
 (0)