aboutsummaryrefslogtreecommitdiff
path: root/helix-term/src/commands.rs
diff options
context:
space:
mode:
authorMichael Davis2022-11-22 02:52:23 +0000
committerGitHub2022-11-22 02:52:23 +0000
commit9059c65a5385f6d3cc0bc7f6e3f835ae542635a5 (patch)
tree6fffacee213769a669c045f1c5c2a07bdf41ec02 /helix-term/src/commands.rs
parent1db01caec7c91e270a23fd4f85955bb235ffbcb7 (diff)
lsp: Check server provider capabilities (#3554)
Language Servers may signal that they do not support a method in the initialization result (server capabilities). We can check these when making LSP requests and hint in the status line when a method is not supported by the server. This can also prevent crashes in servers which assume that clients do not send requests for methods which are disabled in the server capabilities. There is an existing pattern the LSP client module where a method returns `Option<impl Future<Output = Result<_>>>` with `None` signaling no support in the server. This change extends this pattern to the rest of the client functions. And we log an error to the statusline for manually triggered LSP calls which return `None`.
Diffstat (limited to 'helix-term/src/commands.rs')
-rw-r--r--helix-term/src/commands.rs29
1 files changed, 19 insertions, 10 deletions
diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs
index 5b44775b..8af5a7e3 100644
--- a/helix-term/src/commands.rs
+++ b/helix-term/src/commands.rs
@@ -3801,15 +3801,21 @@ fn format_selections(cx: &mut Context) {
let range = ranges[0];
- let edits = tokio::task::block_in_place(|| {
- helix_lsp::block_on(language_server.text_document_range_formatting(
- doc.identifier(),
- range,
- lsp::FormattingOptions::default(),
- None,
- ))
- })
- .unwrap_or_default();
+ let request = match language_server.text_document_range_formatting(
+ doc.identifier(),
+ range,
+ lsp::FormattingOptions::default(),
+ None,
+ ) {
+ Some(future) => future,
+ None => {
+ cx.editor
+ .set_error("Language server does not support range formatting");
+ return;
+ }
+ };
+
+ let edits = tokio::task::block_in_place(|| helix_lsp::block_on(request)).unwrap_or_default();
let transaction = helix_lsp::util::generate_transaction_from_edits(
doc.text(),
@@ -3953,7 +3959,10 @@ pub fn completion(cx: &mut Context) {
let pos = pos_to_lsp_pos(doc.text(), cursor, offset_encoding);
- let future = language_server.completion(doc.identifier(), pos, None);
+ let future = match language_server.completion(doc.identifier(), pos, None) {
+ Some(future) => future,
+ None => return,
+ };
let trigger_offset = cursor;