From 326025d45f87548caba9a56c5606d80f85abc5ff Mon Sep 17 00:00:00 2001 From: Micha Reiser Date: Thu, 4 Dec 2025 14:40:16 +0100 Subject: [PATCH] [ty] Always register rename provider if client doesn't support dynamic registration (#21789) --- crates/ty_server/src/capabilities.rs | 15 +++++---------- crates/ty_server/src/server.rs | 11 ++--------- .../src/server/api/requests/prepare_rename.rs | 1 + crates/ty_server/src/session.rs | 2 +- .../e2e__initialize__initialization.snap | 3 +++ ...initialize__initialization_with_workspace.snap | 3 +++ 6 files changed, 15 insertions(+), 20 deletions(-) diff --git a/crates/ty_server/src/capabilities.rs b/crates/ty_server/src/capabilities.rs index 82837ec026..23daa43dee 100644 --- a/crates/ty_server/src/capabilities.rs +++ b/crates/ty_server/src/capabilities.rs @@ -1,5 +1,5 @@ use lsp_types::{ - ClientCapabilities, CodeActionKind, CodeActionOptions, CompletionOptions, + self as types, ClientCapabilities, CodeActionKind, CodeActionOptions, CompletionOptions, DeclarationCapability, DiagnosticOptions, DiagnosticServerCapabilities, HoverProviderCapability, InlayHintOptions, InlayHintServerCapabilities, MarkupKind, NotebookCellSelector, NotebookSelector, OneOf, RenameOptions, SelectionRangeProviderCapability, @@ -8,11 +8,9 @@ use lsp_types::{ TextDocumentSyncCapability, TextDocumentSyncKind, TextDocumentSyncOptions, TypeDefinitionProviderCapability, WorkDoneProgressOptions, }; +use std::str::FromStr; use crate::PositionEncoding; -use crate::session::GlobalSettings; -use lsp_types as types; -use std::str::FromStr; bitflags::bitflags! { /// Represents the resolved client capabilities for the language server. @@ -349,7 +347,6 @@ impl ResolvedClientCapabilities { pub(crate) fn server_capabilities( position_encoding: PositionEncoding, resolved_client_capabilities: ResolvedClientCapabilities, - global_settings: &GlobalSettings, ) -> ServerCapabilities { let diagnostic_provider = if resolved_client_capabilities.supports_diagnostic_dynamic_registration() { @@ -368,11 +365,9 @@ pub(crate) fn server_capabilities( // dynamically based on the `ty.experimental.rename` setting. None } else { - // Otherwise, we check whether user has enabled rename support via the resolved settings - // from initialization options. - global_settings - .is_rename_enabled() - .then(|| OneOf::Right(server_rename_options())) + // Otherwise, we always register the rename provider and bail out in `prepareRename` if + // the feature is disabled. + Some(OneOf::Right(server_rename_options())) }; ServerCapabilities { diff --git a/crates/ty_server/src/server.rs b/crates/ty_server/src/server.rs index 487febb4b2..321a74857e 100644 --- a/crates/ty_server/src/server.rs +++ b/crates/ty_server/src/server.rs @@ -72,15 +72,8 @@ impl Server { tracing::debug!("Resolved client capabilities: {resolved_client_capabilities}"); let position_encoding = Self::find_best_position_encoding(&client_capabilities); - let server_capabilities = server_capabilities( - position_encoding, - resolved_client_capabilities, - &initialization_options - .options - .global - .clone() - .into_settings(), - ); + let server_capabilities = + server_capabilities(position_encoding, resolved_client_capabilities); let version = ruff_db::program_version().unwrap_or("Unknown"); tracing::info!("Version: {version}"); diff --git a/crates/ty_server/src/server/api/requests/prepare_rename.rs b/crates/ty_server/src/server/api/requests/prepare_rename.rs index 2fd8228201..8601aa2995 100644 --- a/crates/ty_server/src/server/api/requests/prepare_rename.rs +++ b/crates/ty_server/src/server/api/requests/prepare_rename.rs @@ -32,6 +32,7 @@ impl BackgroundDocumentRequestHandler for PrepareRenameRequestHandler { if snapshot .workspace_settings() .is_language_services_disabled() + || !snapshot.global_settings().is_rename_enabled() { return Ok(None); } diff --git a/crates/ty_server/src/session.rs b/crates/ty_server/src/session.rs index 992f02f929..d97e11ac48 100644 --- a/crates/ty_server/src/session.rs +++ b/crates/ty_server/src/session.rs @@ -564,7 +564,7 @@ impl Session { publish_settings_diagnostics(self, client, root); } - if let Some(global_options) = combined_global_options.take() { + if let Some(global_options) = combined_global_options { let global_settings = global_options.into_settings(); if global_settings.diagnostic_mode().is_workspace() { for project in self.projects.values_mut() { diff --git a/crates/ty_server/tests/e2e/snapshots/e2e__initialize__initialization.snap b/crates/ty_server/tests/e2e/snapshots/e2e__initialize__initialization.snap index 79d71626b2..7a8cdce616 100644 --- a/crates/ty_server/tests/e2e/snapshots/e2e__initialize__initialization.snap +++ b/crates/ty_server/tests/e2e/snapshots/e2e__initialize__initialization.snap @@ -48,6 +48,9 @@ expression: initialization_result "quickfix" ] }, + "renameProvider": { + "prepareProvider": true + }, "declarationProvider": true, "executeCommandProvider": { "commands": [ diff --git a/crates/ty_server/tests/e2e/snapshots/e2e__initialize__initialization_with_workspace.snap b/crates/ty_server/tests/e2e/snapshots/e2e__initialize__initialization_with_workspace.snap index 79d71626b2..7a8cdce616 100644 --- a/crates/ty_server/tests/e2e/snapshots/e2e__initialize__initialization_with_workspace.snap +++ b/crates/ty_server/tests/e2e/snapshots/e2e__initialize__initialization_with_workspace.snap @@ -48,6 +48,9 @@ expression: initialization_result "quickfix" ] }, + "renameProvider": { + "prepareProvider": true + }, "declarationProvider": true, "executeCommandProvider": { "commands": [