diff --git a/crates/ty_ide/src/completion.rs b/crates/ty_ide/src/completion.rs index 275b1fcb1e..2082b14a4d 100644 --- a/crates/ty_ide/src/completion.rs +++ b/crates/ty_ide/src/completion.rs @@ -6,6 +6,7 @@ use ruff_text_size::TextSize; use crate::Db; +#[derive(Debug, Clone)] pub struct Completion { pub label: String, } diff --git a/crates/ty_server/src/server.rs b/crates/ty_server/src/server.rs index 36713dc5ca..1e2dcd8707 100644 --- a/crates/ty_server/src/server.rs +++ b/crates/ty_server/src/server.rs @@ -15,7 +15,7 @@ use lsp_types::{ use self::connection::{Connection, ConnectionInitializer}; use self::schedule::event_loop_thread; -use crate::session::{AllSettings, ClientSettings, Session}; +use crate::session::{AllSettings, ClientSettings, Experimental, Session}; use crate::PositionEncoding; mod api; @@ -41,19 +41,6 @@ impl Server { let (id, init_params) = connection.initialize_start()?; - let client_capabilities = init_params.capabilities; - let position_encoding = Self::find_best_position_encoding(&client_capabilities); - let server_capabilities = Self::server_capabilities(position_encoding); - - let connection = connection.initialize_finish( - id, - &server_capabilities, - crate::SERVER_NAME, - crate::version(), - )?; - - crate::message::init_messenger(connection.make_sender()); - let AllSettings { global_settings, mut workspace_settings, @@ -63,6 +50,19 @@ impl Server { .unwrap_or_else(|| serde_json::Value::Object(serde_json::Map::default())), ); + let client_capabilities = init_params.capabilities; + let position_encoding = Self::find_best_position_encoding(&client_capabilities); + let server_capabilities = + Self::server_capabilities(position_encoding, global_settings.experimental.as_ref()); + + let connection = connection.initialize_finish( + id, + &server_capabilities, + crate::SERVER_NAME, + crate::version(), + )?; + + crate::message::init_messenger(connection.make_sender()); crate::logging::init_logging( global_settings.tracing.log_level.unwrap_or_default(), global_settings.tracing.log_file.as_deref(), @@ -206,7 +206,10 @@ impl Server { .unwrap_or_default() } - fn server_capabilities(position_encoding: PositionEncoding) -> ServerCapabilities { + fn server_capabilities( + position_encoding: PositionEncoding, + experimental: Option<&Experimental>, + ) -> ServerCapabilities { ServerCapabilities { position_encoding: Some(position_encoding.into()), diagnostic_provider: Some(DiagnosticServerCapabilities::Options(DiagnosticOptions { @@ -226,9 +229,11 @@ impl Server { inlay_hint_provider: Some(lsp_types::OneOf::Right( InlayHintServerCapabilities::Options(InlayHintOptions::default()), )), - completion_provider: Some(lsp_types::CompletionOptions { - ..Default::default() - }), + completion_provider: experimental + .is_some_and(Experimental::is_completions_enabled) + .then_some(lsp_types::CompletionOptions { + ..Default::default() + }), ..Default::default() } } diff --git a/crates/ty_server/src/session.rs b/crates/ty_server/src/session.rs index a429b492e5..c636a9b28d 100644 --- a/crates/ty_server/src/session.rs +++ b/crates/ty_server/src/session.rs @@ -21,6 +21,7 @@ pub(crate) use self::capabilities::ResolvedClientCapabilities; pub use self::index::DocumentQuery; pub(crate) use self::settings::AllSettings; pub use self::settings::ClientSettings; +pub(crate) use self::settings::Experimental; mod capabilities; pub(crate) mod index; diff --git a/crates/ty_server/src/session/settings.rs b/crates/ty_server/src/session/settings.rs index 8bcd039fdf..64f6fe04a9 100644 --- a/crates/ty_server/src/session/settings.rs +++ b/crates/ty_server/src/session/settings.rs @@ -7,11 +7,35 @@ use serde::Deserialize; /// Maps a workspace URI to its associated client settings. Used during server initialization. pub(crate) type WorkspaceSettingsMap = FxHashMap; +#[derive(Debug, Deserialize, Default)] +#[cfg_attr(test, derive(PartialEq, Eq))] +#[serde(rename_all = "camelCase")] +struct Completions { + enable: Option, +} + +#[derive(Debug, Deserialize, Default)] +#[cfg_attr(test, derive(PartialEq, Eq))] +#[serde(rename_all = "camelCase")] +pub(crate) struct Experimental { + completions: Option, +} + +impl Experimental { + /// Returns `true` if completions are enabled in the settings. + pub(crate) fn is_completions_enabled(&self) -> bool { + self.completions + .as_ref() + .is_some_and(|completions| completions.enable.unwrap_or_default()) + } +} + /// This is a direct representation of the settings schema sent by the client. #[derive(Debug, Deserialize, Default)] #[cfg_attr(test, derive(PartialEq, Eq))] #[serde(rename_all = "camelCase")] pub struct ClientSettings { + pub(crate) experimental: Option, // These settings are only needed for tracing, and are only read from the global configuration. // These will not be in the resolved settings. #[serde(flatten)]