emmylua_ls 0.16.0

A language server for emmylua.
Documentation
use lsp_types::{ClientCapabilities, DidChangeConfigurationParams, ServerCapabilities};

use crate::{context::ServerContextSnapshot, handlers::initialized::get_client_config};

use super::RegisterCapabilities;

pub async fn on_did_change_configuration(
    context: ServerContextSnapshot,
    params: DidChangeConfigurationParams,
) -> Option<()> {
    let pretty_json = serde_json::to_string_pretty(&params).ok()?;
    log::info!("on_did_change_configuration: {}", pretty_json);

    // Check initialization status and get client config
    let (is_initialized, client_id, supports_config_request) = {
        let workspace_manager = context.workspace_manager().read().await;
        let is_initialized = workspace_manager.is_workspace_initialized();
        let client_id = workspace_manager.client_config.client_id;
        let supports_config_request = context.lsp_features().supports_config_request();
        (is_initialized, client_id, supports_config_request)
    };

    if !is_initialized {
        return Some(());
    }

    if client_id.is_vscode() {
        return Some(());
    }

    log::info!("change config client_id: {:?}", client_id);

    // Get new config without holding any locks
    let new_client_config = get_client_config(&context, client_id, supports_config_request).await;

    // Update config and reload - acquire write lock only when necessary
    {
        let mut workspace_manager = context.workspace_manager().write().await;
        workspace_manager.client_config = new_client_config;
        log::info!("reloading workspace folders");
        workspace_manager.reload_workspace().await;
    }

    Some(())
}

pub struct ConfigurationCapabilities;

impl RegisterCapabilities for ConfigurationCapabilities {
    fn register_capabilities(_: &mut ServerCapabilities, _: &ClientCapabilities) {}
}