Skip to content

Commit

Permalink
Inspect configuration's client capability
Browse files Browse the repository at this point in the history
  • Loading branch information
lionel- committed Jan 15, 2025
1 parent 7240339 commit 5a37584
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 11 deletions.
16 changes: 12 additions & 4 deletions crates/lsp/src/capabilities.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,17 @@
use tower_lsp::lsp_types::ClientCapabilities;
use tower_lsp::lsp_types::PositionEncodingKind;

/// A resolved representation of the [ClientCapabilities] the Client sends over that we
/// actually do something with
/// The subset of [ClientCapabilities] the Client sends over that we actually do
/// something with
#[derive(Debug, Default)]
pub(crate) struct ResolvedClientCapabilities {
pub(crate) struct AirClientCapabilities {
pub(crate) position_encodings: Vec<PositionEncodingKind>,
pub(crate) dynamic_registration_for_did_change_configuration: bool,
pub(crate) dynamic_registration_for_did_change_watched_files: bool,
pub(crate) request_configuration: bool,
}

impl ResolvedClientCapabilities {
impl AirClientCapabilities {
pub(crate) fn new(capabilities: ClientCapabilities) -> Self {
let position_encodings = capabilities
.general
Expand All @@ -38,10 +39,17 @@ impl ResolvedClientCapabilities {
.and_then(|watched_files| watched_files.dynamic_registration)
.unwrap_or_default();

let configuration = capabilities
.workspace
.as_ref()
.and_then(|workspace| workspace.configuration)
.unwrap_or_default();

Self {
position_encodings,
dynamic_registration_for_did_change_configuration,
dynamic_registration_for_did_change_watched_files,
request_configuration: configuration,
}
}
}
8 changes: 4 additions & 4 deletions crates/lsp/src/handlers_state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ use tower_lsp::lsp_types::WorkspaceServerCapabilities;
use tracing::Instrument;
use url::Url;

use crate::capabilities::ResolvedClientCapabilities;
use crate::capabilities::AirClientCapabilities;
use crate::documents::Document;
use crate::logging;
use crate::logging::LogMessageSender;
Expand Down Expand Up @@ -95,7 +95,7 @@ pub(crate) fn initialize(
params.workspace_folders.unwrap_or_default(),
);

lsp_state.capabilities = ResolvedClientCapabilities::new(params.capabilities);
lsp_state.capabilities = AirClientCapabilities::new(params.capabilities);

// If the client supports UTF-8 we use that, even if it's not its
// preferred encoding (at position 0). Otherwise we use the mandatory
Expand Down Expand Up @@ -154,7 +154,7 @@ pub(crate) async fn did_open(

// TODO: Remove once the test client knows about the `configuration`
// server-to-client request
if !cfg!(test) {
if lsp_state.capabilities.request_configuration {
update_config(vec![uri], client, lsp_state, state)
.instrument(tracing::info_span!("did_change_configuration"))
.await?;
Expand Down Expand Up @@ -365,7 +365,7 @@ fn update_diagnostics_config(
}

fn update_documents_config(
keys: IntoIter<&str, 4>,
keys: IntoIter<&str, 3>,
mut items: impl Iterator<Item = Value>,
uris: Vec<Url>,
state: &mut WorldState,
Expand Down
6 changes: 3 additions & 3 deletions crates/lsp/src/main_loop.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ use tower_lsp::Client;
use url::Url;
use workspace::settings::Settings;

use crate::capabilities::ResolvedClientCapabilities;
use crate::capabilities::AirClientCapabilities;
use crate::handlers;
use crate::handlers_ext;
use crate::handlers_format;
Expand Down Expand Up @@ -166,7 +166,7 @@ pub(crate) struct LspState {
pub(crate) parsers: HashMap<Url, tree_sitter::Parser>,

/// List of client capabilities that we care about
pub(crate) capabilities: ResolvedClientCapabilities,
pub(crate) capabilities: AirClientCapabilities,

/// State used to dynamically update the log level
pub(crate) log_state: Option<logging::LogState>,
Expand All @@ -179,7 +179,7 @@ impl Default for LspState {
// Default encoding specified in the LSP protocol
position_encoding: PositionEncoding::Wide(WideEncoding::Utf16),
parsers: Default::default(),
capabilities: ResolvedClientCapabilities::default(),
capabilities: AirClientCapabilities::default(),
log_state: None,
}
}
Expand Down

0 comments on commit 5a37584

Please sign in to comment.