Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'helix-lsp/src/client.rs')
-rw-r--r--helix-lsp/src/client.rs114
1 files changed, 41 insertions, 73 deletions
diff --git a/helix-lsp/src/client.rs b/helix-lsp/src/client.rs
index bf8a8695..e5a116d7 100644
--- a/helix-lsp/src/client.rs
+++ b/helix-lsp/src/client.rs
@@ -386,22 +386,10 @@ impl Client {
}
/// Execute a RPC request on the language server.
- async fn request<R: lsp::request::Request>(&self, params: R::Params) -> Result<R::Result>
- where
- R::Params: serde::Serialize,
- R::Result: core::fmt::Debug, // TODO: temporary
- {
- // a future that resolves into the response
- let json = self.call::<R>(params).await?;
- let response = serde_json::from_value(json)?;
- Ok(response)
- }
-
- /// Execute a RPC request on the language server.
fn call<R: lsp::request::Request>(
&self,
params: R::Params,
- ) -> impl Future<Output = Result<Value>>
+ ) -> impl Future<Output = Result<R::Result>>
where
R::Params: serde::Serialize,
{
@@ -411,7 +399,7 @@ impl Client {
fn call_with_ref<R: lsp::request::Request>(
&self,
params: &R::Params,
- ) -> impl Future<Output = Result<Value>>
+ ) -> impl Future<Output = Result<R::Result>>
where
R::Params: serde::Serialize,
{
@@ -422,7 +410,7 @@ impl Client {
&self,
params: &R::Params,
timeout_secs: u64,
- ) -> impl Future<Output = Result<Value>>
+ ) -> impl Future<Output = Result<R::Result>>
where
R::Params: serde::Serialize,
{
@@ -458,6 +446,7 @@ impl Client {
.await
.map_err(|_| Error::Timeout(id))? // return Timeout
.ok_or(Error::StreamClosed)?
+ .and_then(|value| serde_json::from_value(value).map_err(Into::into))
}
}
@@ -697,11 +686,11 @@ impl Client {
work_done_progress_params: lsp::WorkDoneProgressParams::default(),
};
- self.request::<lsp::request::Initialize>(params).await
+ self.call::<lsp::request::Initialize>(params).await
}
pub async fn shutdown(&self) -> Result<()> {
- self.request::<lsp::request::Shutdown>(()).await
+ self.call::<lsp::request::Shutdown>(()).await
}
pub fn exit(&self) {
@@ -746,7 +735,7 @@ impl Client {
old_path: &Path,
new_path: &Path,
is_dir: bool,
- ) -> Option<impl Future<Output = Result<lsp::WorkspaceEdit>>> {
+ ) -> Option<impl Future<Output = Result<Option<lsp::WorkspaceEdit>>>> {
let capabilities = self.file_operations_intests();
if !capabilities.will_rename.has_interest(old_path, is_dir) {
return None;
@@ -763,16 +752,10 @@ impl Client {
old_uri: url_from_path(old_path)?,
new_uri: url_from_path(new_path)?,
}];
- let request = self.call_with_timeout::<lsp::request::WillRenameFiles>(
+ Some(self.call_with_timeout::<lsp::request::WillRenameFiles>(
&lsp::RenameFilesParams { files },
5,
- );
-
- Some(async move {
- let json = request.await?;
- let response: Option<lsp::WorkspaceEdit> = serde_json::from_value(json)?;
- Ok(response.unwrap_or_default())
- })
+ ))
}
pub fn did_rename(&self, old_path: &Path, new_path: &Path, is_dir: bool) -> Option<()> {
@@ -1016,7 +999,7 @@ impl Client {
position: lsp::Position,
work_done_token: Option<lsp::ProgressToken>,
context: lsp::CompletionContext,
- ) -> Option<impl Future<Output = Result<Value>>> {
+ ) -> Option<impl Future<Output = Result<Option<lsp::CompletionResponse>>>> {
let capabilities = self.capabilities.get().unwrap();
// Return early if the server does not support completion.
@@ -1042,14 +1025,13 @@ impl Client {
&self,
completion_item: &lsp::CompletionItem,
) -> impl Future<Output = Result<lsp::CompletionItem>> {
- let res = self.call_with_ref::<lsp::request::ResolveCompletionItem>(completion_item);
- async move { Ok(serde_json::from_value(res.await?)?) }
+ self.call_with_ref::<lsp::request::ResolveCompletionItem>(completion_item)
}
pub fn resolve_code_action(
&self,
- code_action: lsp::CodeAction,
- ) -> Option<impl Future<Output = Result<Value>>> {
+ code_action: &lsp::CodeAction,
+ ) -> Option<impl Future<Output = Result<lsp::CodeAction>>> {
let capabilities = self.capabilities.get().unwrap();
// Return early if the server does not support resolving code actions.
@@ -1061,7 +1043,7 @@ impl Client {
_ => return None,
}
- Some(self.call::<lsp::request::CodeActionResolveRequest>(code_action))
+ Some(self.call_with_ref::<lsp::request::CodeActionResolveRequest>(code_action))
}
pub fn text_document_signature_help(
@@ -1085,8 +1067,7 @@ impl Client {
// lsp::SignatureHelpContext
};
- let res = self.call::<lsp::request::SignatureHelpRequest>(params);
- Some(async move { Ok(serde_json::from_value(res.await?)?) })
+ Some(self.call::<lsp::request::SignatureHelpRequest>(params))
}
pub fn text_document_range_inlay_hints(
@@ -1094,7 +1075,7 @@ impl Client {
text_document: lsp::TextDocumentIdentifier,
range: lsp::Range,
work_done_token: Option<lsp::ProgressToken>,
- ) -> Option<impl Future<Output = Result<Value>>> {
+ ) -> Option<impl Future<Output = Result<Option<Vec<lsp::InlayHint>>>>> {
let capabilities = self.capabilities.get().unwrap();
match capabilities.inlay_hint_provider {
@@ -1140,8 +1121,7 @@ impl Client {
// lsp::SignatureHelpContext
};
- let res = self.call::<lsp::request::HoverRequest>(params);
- Some(async move { Ok(serde_json::from_value(res.await?)?) })
+ Some(self.call::<lsp::request::HoverRequest>(params))
}
// formatting
@@ -1151,7 +1131,7 @@ impl Client {
text_document: lsp::TextDocumentIdentifier,
options: lsp::FormattingOptions,
work_done_token: Option<lsp::ProgressToken>,
- ) -> Option<impl Future<Output = Result<Vec<lsp::TextEdit>>>> {
+ ) -> Option<impl Future<Output = Result<Option<Vec<lsp::TextEdit>>>>> {
let capabilities = self.capabilities.get().unwrap();
// Return early if the server does not support formatting.
@@ -1184,13 +1164,7 @@ impl Client {
work_done_progress_params: lsp::WorkDoneProgressParams { work_done_token },
};
- let request = self.call::<lsp::request::Formatting>(params);
-
- Some(async move {
- let json = request.await?;
- let response: Option<Vec<lsp::TextEdit>> = serde_json::from_value(json)?;
- Ok(response.unwrap_or_default())
- })
+ Some(self.call::<lsp::request::Formatting>(params))
}
pub fn text_document_range_formatting(
@@ -1199,7 +1173,7 @@ impl Client {
range: lsp::Range,
options: lsp::FormattingOptions,
work_done_token: Option<lsp::ProgressToken>,
- ) -> Option<impl Future<Output = Result<Vec<lsp::TextEdit>>>> {
+ ) -> Option<impl Future<Output = Result<Option<Vec<lsp::TextEdit>>>>> {
let capabilities = self.capabilities.get().unwrap();
// Return early if the server does not support range formatting.
@@ -1215,13 +1189,7 @@ impl Client {
work_done_progress_params: lsp::WorkDoneProgressParams { work_done_token },
};
- let request = self.call::<lsp::request::RangeFormatting>(params);
-
- Some(async move {
- let json = request.await?;
- let response: Option<Vec<lsp::TextEdit>> = serde_json::from_value(json)?;
- Ok(response.unwrap_or_default())
- })
+ Some(self.call::<lsp::request::RangeFormatting>(params))
}
pub fn text_document_document_highlight(
@@ -1229,7 +1197,7 @@ impl Client {
text_document: lsp::TextDocumentIdentifier,
position: lsp::Position,
work_done_token: Option<lsp::ProgressToken>,
- ) -> Option<impl Future<Output = Result<Value>>> {
+ ) -> Option<impl Future<Output = Result<Option<Vec<lsp::DocumentHighlight>>>>> {
let capabilities = self.capabilities.get().unwrap();
// Return early if the server does not support document highlight.
@@ -1262,7 +1230,7 @@ impl Client {
text_document: lsp::TextDocumentIdentifier,
position: lsp::Position,
work_done_token: Option<lsp::ProgressToken>,
- ) -> impl Future<Output = Result<Value>> {
+ ) -> impl Future<Output = Result<T::Result>> {
let params = lsp::GotoDefinitionParams {
text_document_position_params: lsp::TextDocumentPositionParams {
text_document,
@@ -1282,7 +1250,7 @@ impl Client {
text_document: lsp::TextDocumentIdentifier,
position: lsp::Position,
work_done_token: Option<lsp::ProgressToken>,
- ) -> Option<impl Future<Output = Result<Value>>> {
+ ) -> Option<impl Future<Output = Result<Option<lsp::GotoDefinitionResponse>>>> {
let capabilities = self.capabilities.get().unwrap();
// Return early if the server does not support goto-definition.
@@ -1303,7 +1271,7 @@ impl Client {
text_document: lsp::TextDocumentIdentifier,
position: lsp::Position,
work_done_token: Option<lsp::ProgressToken>,
- ) -> Option<impl Future<Output = Result<Value>>> {
+ ) -> Option<impl Future<Output = Result<Option<lsp::GotoDefinitionResponse>>>> {
let capabilities = self.capabilities.get().unwrap();
// Return early if the server does not support goto-declaration.
@@ -1328,7 +1296,7 @@ impl Client {
text_document: lsp::TextDocumentIdentifier,
position: lsp::Position,
work_done_token: Option<lsp::ProgressToken>,
- ) -> Option<impl Future<Output = Result<Value>>> {
+ ) -> Option<impl Future<Output = Result<Option<lsp::GotoDefinitionResponse>>>> {
let capabilities = self.capabilities.get().unwrap();
// Return early if the server does not support goto-type-definition.
@@ -1352,7 +1320,7 @@ impl Client {
text_document: lsp::TextDocumentIdentifier,
position: lsp::Position,
work_done_token: Option<lsp::ProgressToken>,
- ) -> Option<impl Future<Output = Result<Value>>> {
+ ) -> Option<impl Future<Output = Result<Option<lsp::GotoDefinitionResponse>>>> {
let capabilities = self.capabilities.get().unwrap();
// Return early if the server does not support goto-definition.
@@ -1377,7 +1345,7 @@ impl Client {
position: lsp::Position,
include_declaration: bool,
work_done_token: Option<lsp::ProgressToken>,
- ) -> Option<impl Future<Output = Result<Value>>> {
+ ) -> Option<impl Future<Output = Result<Option<Vec<lsp::Location>>>>> {
let capabilities = self.capabilities.get().unwrap();
// Return early if the server does not support goto-reference.
@@ -1406,7 +1374,7 @@ impl Client {
pub fn document_symbols(
&self,
text_document: lsp::TextDocumentIdentifier,
- ) -> Option<impl Future<Output = Result<Value>>> {
+ ) -> Option<impl Future<Output = Result<Option<lsp::DocumentSymbolResponse>>>> {
let capabilities = self.capabilities.get().unwrap();
// Return early if the server does not support document symbols.
@@ -1428,7 +1396,7 @@ impl Client {
&self,
text_document: lsp::TextDocumentIdentifier,
position: lsp::Position,
- ) -> Option<impl Future<Output = Result<Value>>> {
+ ) -> Option<impl Future<Output = Result<Option<lsp::PrepareRenameResponse>>>> {
let capabilities = self.capabilities.get().unwrap();
match capabilities.rename_provider {
@@ -1448,7 +1416,10 @@ impl Client {
}
// empty string to get all symbols
- pub fn workspace_symbols(&self, query: String) -> Option<impl Future<Output = Result<Value>>> {
+ pub fn workspace_symbols(
+ &self,
+ query: String,
+ ) -> Option<impl Future<Output = Result<Option<lsp::WorkspaceSymbolResponse>>>> {
let capabilities = self.capabilities.get().unwrap();
// Return early if the server does not support workspace symbols.
@@ -1471,7 +1442,7 @@ impl Client {
text_document: lsp::TextDocumentIdentifier,
range: lsp::Range,
context: lsp::CodeActionContext,
- ) -> Option<impl Future<Output = Result<Value>>> {
+ ) -> Option<impl Future<Output = Result<Option<Vec<lsp::CodeActionOrCommand>>>>> {
let capabilities = self.capabilities.get().unwrap();
// Return early if the server does not support code actions.
@@ -1499,7 +1470,7 @@ impl Client {
text_document: lsp::TextDocumentIdentifier,
position: lsp::Position,
new_name: String,
- ) -> Option<impl Future<Output = Result<lsp::WorkspaceEdit>>> {
+ ) -> Option<impl Future<Output = Result<Option<lsp::WorkspaceEdit>>>> {
if !self.supports_feature(LanguageServerFeature::RenameSymbol) {
return None;
}
@@ -1515,16 +1486,13 @@ impl Client {
},
};
- let request = self.call::<lsp::request::Rename>(params);
-
- Some(async move {
- let json = request.await?;
- let response: Option<lsp::WorkspaceEdit> = serde_json::from_value(json)?;
- Ok(response.unwrap_or_default())
- })
+ Some(self.call::<lsp::request::Rename>(params))
}
- pub fn command(&self, command: lsp::Command) -> Option<impl Future<Output = Result<Value>>> {
+ pub fn command(
+ &self,
+ command: lsp::Command,
+ ) -> Option<impl Future<Output = Result<Option<Value>>>> {
let capabilities = self.capabilities.get().unwrap();
// Return early if the language server does not support executing commands.