glua_ls 1.0.27

Language server for Garry's Mod Lua (GLua).
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 (client_id, supports_config_request) = {
        let workspace_manager = context.workspace_manager().read().await;
        let client_id = workspace_manager.client_config.client_id;
        let supports_config_request = context.lsp_features().supports_config_request();
        (client_id, supports_config_request)
    };

    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;
        if workspace_manager.client_config == new_client_config {
            log::info!("skip workspace reload; client config unchanged");
            return Some(());
        }

        workspace_manager.client_config = new_client_config;
        log::info!("reloading workspace folders");
        workspace_manager.add_reload_workspace_task(context.workspace_manager_arc());
    }

    Some(())
}

pub struct ConfigurationCapabilities;

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