Skip to content

Commit df15ad6

Browse files
skewb1kematipico
andauthored
fix(lsp): add missing checks for capability dynamic registration support (#6643)
Co-authored-by: ematipico <602478+ematipico@users.noreply.github.com>
1 parent 2897532 commit df15ad6

File tree

3 files changed

+69
-6
lines changed

3 files changed

+69
-6
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@biomejs/biome": patch
3+
---
4+
5+
Fixed [#4994]([https://github.com/biomejs/biome/discussions/4994). LSP server registered some capabilities even when the client did not support dynamic registration.

crates/biome_lsp/src/server.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,9 @@ impl LSPServer {
121121
async fn setup_capabilities(&self) {
122122
let mut capabilities = CapabilitySet::default();
123123

124+
let is_linting_and_formatting_disabled = self.session.is_linting_and_formatting_disabled();
125+
debug!("Requires configuration: {is_linting_and_formatting_disabled}");
126+
124127
capabilities.add_capability(
125128
"biome_did_change_extension_settings",
126129
"workspace/didChangeConfiguration",
@@ -193,7 +196,7 @@ impl LSPServer {
193196
capabilities.add_capability(
194197
"biome_formatting",
195198
"textDocument/formatting",
196-
if self.session.is_linting_and_formatting_disabled() {
199+
if is_linting_and_formatting_disabled || !self.session.can_register_formatting() {
197200
CapabilityStatus::Disable
198201
} else {
199202
CapabilityStatus::Enable(None)
@@ -202,7 +205,7 @@ impl LSPServer {
202205
capabilities.add_capability(
203206
"biome_range_formatting",
204207
"textDocument/rangeFormatting",
205-
if self.session.is_linting_and_formatting_disabled() {
208+
if is_linting_and_formatting_disabled || !self.session.can_register_range_formatting() {
206209
CapabilityStatus::Disable
207210
} else {
208211
CapabilityStatus::Enable(None)
@@ -211,7 +214,8 @@ impl LSPServer {
211214
capabilities.add_capability(
212215
"biome_on_type_formatting",
213216
"textDocument/onTypeFormatting",
214-
if self.session.is_linting_and_formatting_disabled() {
217+
if is_linting_and_formatting_disabled || !self.session.can_register_on_type_formatting()
218+
{
215219
CapabilityStatus::Disable
216220
} else {
217221
CapabilityStatus::Enable(Some(json!(DocumentOnTypeFormattingRegistrationOptions {
@@ -222,12 +226,10 @@ impl LSPServer {
222226
},
223227
);
224228

225-
let f = self.session.is_linting_and_formatting_disabled();
226-
debug!("Requires configuration: {f}");
227229
capabilities.add_capability(
228230
"biome_code_action",
229231
"textDocument/codeAction",
230-
if self.session.is_linting_and_formatting_disabled() {
232+
if is_linting_and_formatting_disabled || !self.session.can_register_code_action() {
231233
CapabilityStatus::Disable
232234
} else {
233235
CapabilityStatus::Enable(Some(json!(CodeActionProviderCapability::from(

crates/biome_lsp/src/session.rs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,48 @@ impl Session {
507507
result
508508
}
509509

510+
#[instrument(level = "info", skip(self))]
511+
pub(crate) fn can_register_on_type_formatting(&self) -> bool {
512+
let result = self
513+
.initialize_params
514+
.get()
515+
.and_then(|c| c.client_capabilities.text_document.as_ref())
516+
.and_then(|c| c.on_type_formatting)
517+
.and_then(|c| c.dynamic_registration)
518+
== Some(true);
519+
520+
info!("Can register onTypeFormatting: {result}");
521+
result
522+
}
523+
524+
#[instrument(level = "info", skip(self))]
525+
pub(crate) fn can_register_formatting(&self) -> bool {
526+
let result = self
527+
.initialize_params
528+
.get()
529+
.and_then(|c| c.client_capabilities.text_document.as_ref())
530+
.and_then(|c| c.formatting)
531+
.and_then(|c| c.dynamic_registration)
532+
== Some(true);
533+
534+
info!("Can register formatting: {result}");
535+
result
536+
}
537+
538+
#[instrument(level = "info", skip(self))]
539+
pub(crate) fn can_register_range_formatting(&self) -> bool {
540+
let result = self
541+
.initialize_params
542+
.get()
543+
.and_then(|c| c.client_capabilities.text_document.as_ref())
544+
.and_then(|c| c.range_formatting)
545+
.and_then(|c| c.dynamic_registration)
546+
== Some(true);
547+
548+
info!("Can register rangeFormatting: {result}");
549+
result
550+
}
551+
510552
#[instrument(level = "info", skip(self))]
511553
pub(crate) fn can_register_did_change_watched_files(&self) -> bool {
512554
let result = self
@@ -521,6 +563,20 @@ impl Session {
521563
result
522564
}
523565

566+
#[instrument(level = "info", skip(self))]
567+
pub(crate) fn can_register_code_action(&self) -> bool {
568+
let result = self
569+
.initialize_params
570+
.get()
571+
.and_then(|c| c.client_capabilities.text_document.as_ref())
572+
.and_then(|c| c.code_action.as_ref())
573+
.and_then(|c| c.dynamic_registration)
574+
== Some(true);
575+
576+
info!("Can register codeAction: {result}");
577+
result
578+
}
579+
524580
/// Get the current workspace folders
525581
pub(crate) fn get_workspace_folders(&self) -> Option<&Vec<WorkspaceFolder>> {
526582
self.initialize_params

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy