Skip to content

Commit ba70a97

Browse files
committed
Make completions an opt-in LSP feature
1 parent ad658f4 commit ba70a97

File tree

4 files changed

+47
-16
lines changed

4 files changed

+47
-16
lines changed

crates/ty_ide/src/completion.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use ruff_text_size::TextSize;
66

77
use crate::Db;
88

9+
#[derive(Debug, Clone)]
910
pub struct Completion {
1011
pub label: String,
1112
}

crates/ty_server/src/server.rs

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use lsp_types::{
1515

1616
use self::connection::{Connection, ConnectionInitializer};
1717
use self::schedule::event_loop_thread;
18-
use crate::session::{AllSettings, ClientSettings, Session};
18+
use crate::session::{AllSettings, ClientSettings, Experimental, Session};
1919
use crate::PositionEncoding;
2020

2121
mod api;
@@ -41,9 +41,19 @@ impl Server {
4141

4242
let (id, init_params) = connection.initialize_start()?;
4343

44+
let AllSettings {
45+
global_settings,
46+
mut workspace_settings,
47+
} = AllSettings::from_value(
48+
init_params
49+
.initialization_options
50+
.unwrap_or_else(|| serde_json::Value::Object(serde_json::Map::default())),
51+
);
52+
4453
let client_capabilities = init_params.capabilities;
4554
let position_encoding = Self::find_best_position_encoding(&client_capabilities);
46-
let server_capabilities = Self::server_capabilities(position_encoding);
55+
let server_capabilities =
56+
Self::server_capabilities(position_encoding, global_settings.experimental.as_ref());
4757

4858
let connection = connection.initialize_finish(
4959
id,
@@ -53,16 +63,6 @@ impl Server {
5363
)?;
5464

5565
crate::message::init_messenger(connection.make_sender());
56-
57-
let AllSettings {
58-
global_settings,
59-
mut workspace_settings,
60-
} = AllSettings::from_value(
61-
init_params
62-
.initialization_options
63-
.unwrap_or_else(|| serde_json::Value::Object(serde_json::Map::default())),
64-
);
65-
6666
crate::logging::init_logging(
6767
global_settings.tracing.log_level.unwrap_or_default(),
6868
global_settings.tracing.log_file.as_deref(),
@@ -206,7 +206,10 @@ impl Server {
206206
.unwrap_or_default()
207207
}
208208

209-
fn server_capabilities(position_encoding: PositionEncoding) -> ServerCapabilities {
209+
fn server_capabilities(
210+
position_encoding: PositionEncoding,
211+
experimental: Option<&Experimental>,
212+
) -> ServerCapabilities {
210213
ServerCapabilities {
211214
position_encoding: Some(position_encoding.into()),
212215
diagnostic_provider: Some(DiagnosticServerCapabilities::Options(DiagnosticOptions {
@@ -226,9 +229,11 @@ impl Server {
226229
inlay_hint_provider: Some(lsp_types::OneOf::Right(
227230
InlayHintServerCapabilities::Options(InlayHintOptions::default()),
228231
)),
229-
completion_provider: Some(lsp_types::CompletionOptions {
230-
..Default::default()
231-
}),
232+
completion_provider: experimental
233+
.is_some_and(Experimental::is_completions_enabled)
234+
.then_some(lsp_types::CompletionOptions {
235+
..Default::default()
236+
}),
232237
..Default::default()
233238
}
234239
}

crates/ty_server/src/session.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ pub(crate) use self::capabilities::ResolvedClientCapabilities;
2121
pub use self::index::DocumentQuery;
2222
pub(crate) use self::settings::AllSettings;
2323
pub use self::settings::ClientSettings;
24+
pub(crate) use self::settings::Experimental;
2425

2526
mod capabilities;
2627
pub(crate) mod index;

crates/ty_server/src/session/settings.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,35 @@ use serde::Deserialize;
77
/// Maps a workspace URI to its associated client settings. Used during server initialization.
88
pub(crate) type WorkspaceSettingsMap = FxHashMap<Url, ClientSettings>;
99

10+
#[derive(Debug, Deserialize, Default)]
11+
#[cfg_attr(test, derive(PartialEq, Eq))]
12+
#[serde(rename_all = "camelCase")]
13+
struct Completions {
14+
enable: Option<bool>,
15+
}
16+
17+
#[derive(Debug, Deserialize, Default)]
18+
#[cfg_attr(test, derive(PartialEq, Eq))]
19+
#[serde(rename_all = "camelCase")]
20+
pub(crate) struct Experimental {
21+
completions: Option<Completions>,
22+
}
23+
24+
impl Experimental {
25+
/// Returns `true` if completions are enabled in the settings.
26+
pub(crate) fn is_completions_enabled(&self) -> bool {
27+
self.completions
28+
.as_ref()
29+
.is_some_and(|completions| completions.enable.unwrap_or_default())
30+
}
31+
}
32+
1033
/// This is a direct representation of the settings schema sent by the client.
1134
#[derive(Debug, Deserialize, Default)]
1235
#[cfg_attr(test, derive(PartialEq, Eq))]
1336
#[serde(rename_all = "camelCase")]
1437
pub struct ClientSettings {
38+
pub(crate) experimental: Option<Experimental>,
1539
// These settings are only needed for tracing, and are only read from the global configuration.
1640
// These will not be in the resolved settings.
1741
#[serde(flatten)]

0 commit comments

Comments
 (0)