diff --git a/crates/ty_server/src/server.rs b/crates/ty_server/src/server.rs index 321a74857e..402800d325 100644 --- a/crates/ty_server/src/server.rs +++ b/crates/ty_server/src/server.rs @@ -3,7 +3,7 @@ use self::schedule::spawn_main_loop; use crate::PositionEncoding; use crate::capabilities::{ResolvedClientCapabilities, server_capabilities}; -use crate::session::{InitializationOptions, Session}; +use crate::session::{InitializationOptions, Session, warn_about_unknown_options}; use anyhow::Context; use lsp_server::Connection; use lsp_types::{ClientCapabilities, InitializeParams, MessageType, Url}; @@ -96,29 +96,7 @@ impl Server { let unknown_options = &initialization_options.options.unknown; if !unknown_options.is_empty() { - // HACK: Old versions of the ty VS Code extension used a custom schema for settings - // which was changed in version 2025.35.0. This is to ensure that users don't receive - // unnecessary warnings when using an older version of the extension. This should be - // removed after a few releases. - if !unknown_options.contains_key("settings") - || !unknown_options.contains_key("globalSettings") - { - tracing::warn!( - "Received unknown options during initialization: {}", - serde_json::to_string_pretty(&unknown_options) - .unwrap_or_else(|_| format!("{unknown_options:?}")) - ); - - client.show_warning_message(format_args!( - "Received unknown options during initialization: '{}'. \ - Refer to the logs for more details", - unknown_options - .keys() - .map(String::as_str) - .collect::>() - .join("', '") - )); - } + warn_about_unknown_options(&client, None, unknown_options); } // Get workspace URLs without settings - settings will come from workspace/configuration diff --git a/crates/ty_server/src/session.rs b/crates/ty_server/src/session.rs index d97e11ac48..233b0e6aa3 100644 --- a/crates/ty_server/src/session.rs +++ b/crates/ty_server/src/session.rs @@ -1,6 +1,6 @@ //! Data model, state management, and configuration resolution. -use std::collections::{BTreeMap, HashSet, VecDeque}; +use std::collections::{BTreeMap, HashMap, HashSet, VecDeque}; use std::ops::{Deref, DerefMut}; use std::panic::RefUnwindSafe; use std::sync::Arc; @@ -467,28 +467,7 @@ impl Session { let unknown_options = &options.unknown; if !unknown_options.is_empty() { - // HACK: This is to ensure that users with an older version of the ty VS Code - // extension don't get warnings about unknown options when they are using a newer - // version of the language server. This should be removed after a few releases. - if !unknown_options.contains_key("importStrategy") - && !unknown_options.contains_key("interpreter") - { - tracing::warn!( - "Received unknown options for workspace `{url}`: {}", - serde_json::to_string_pretty(unknown_options) - .unwrap_or_else(|_| format!("{unknown_options:?}")) - ); - - client.show_warning_message(format!( - "Received unknown options for workspace `{url}`: '{}'. \ - Refer to the logs for more details.", - unknown_options - .keys() - .map(String::as_str) - .collect::>() - .join("', '") - )); - } + warn_about_unknown_options(client, Some(&url), unknown_options); } combined_global_options.combine_with(Some(global)); @@ -1595,3 +1574,29 @@ impl DocumentHandle { Ok(requires_clear_diagnostics) } } + +/// Warns about unknown options received by the server. +/// +/// If `workspace_url` is `Some`, it indicates that the unknown options were received during a +/// workspace initialization, otherwise they were received during the server initialization. +pub(super) fn warn_about_unknown_options( + client: &Client, + workspace_url: Option<&Url>, + unknown_options: &HashMap, +) { + let message = if let Some(workspace_url) = workspace_url { + format!( + "Received unknown options for workspace `{workspace_url}`: {}", + serde_json::to_string_pretty(unknown_options) + .unwrap_or_else(|_| format!("{unknown_options:?}")) + ) + } else { + format!( + "Received unknown options during initialization: {}", + serde_json::to_string_pretty(unknown_options) + .unwrap_or_else(|_| format!("{unknown_options:?}")) + ) + }; + tracing::warn!("{message}"); + client.show_warning_message(message); +} diff --git a/crates/ty_server/tests/e2e/initialize.rs b/crates/ty_server/tests/e2e/initialize.rs index 1526e78022..8611afdccd 100644 --- a/crates/ty_server/tests/e2e/initialize.rs +++ b/crates/ty_server/tests/e2e/initialize.rs @@ -402,7 +402,7 @@ fn unknown_initialization_options() -> Result<()> { insta::assert_json_snapshot!(show_message_params, @r#" { "type": 2, - "message": "Received unknown options during initialization: 'bar'. Refer to the logs for more details" + "message": "Received unknown options during initialization: {\n /"bar/": null\n}" } "#); @@ -427,7 +427,7 @@ fn unknown_options_in_workspace_configuration() -> Result<()> { insta::assert_json_snapshot!(show_message_params, @r#" { "type": 2, - "message": "Received unknown options for workspace `file:///foo`: 'bar'. Refer to the logs for more details." + "message": "Received unknown options for workspace `file:///foo`: {\n /"bar/": null\n}" } "#);