aboutsummaryrefslogtreecommitdiff
path: root/helix-term/src
diff options
context:
space:
mode:
authorMichael Davis2023-03-08 01:50:57 +0000
committerGitHub2023-03-08 01:50:57 +0000
commit170593161cb23edc433d937eb62a9b8fd76bd339 (patch)
treeb126e9bed647e91c7086a51050a43ed4f324c8d7 /helix-term/src
parent563ac1a3cb7e909b345cf5c892c3bcf39b2e32a4 (diff)
LSP: Send replies for malformed and unhandled RPC requests (#6058)
Previously we did not respond to malformed or unhandled LSP requests. The JSONRPC spec says that all non-notification requests must have responses: > When a rpc call is made, the Server MUST reply with a Response, > except for in the case of Notifications (Note that Helix is the "Server" in this case. Also from the spec: "The Server is defined as the origin of Response objects and the handler of Request objects.") So this change sends error replies for requests which can't be parsed or handled. Request IDs are also now added to the log messages for unhandled requests.
Diffstat (limited to 'helix-term/src')
-rw-r--r--helix-term/src/application.rs34
1 files changed, 21 insertions, 13 deletions
diff --git a/helix-term/src/application.rs b/helix-term/src/application.rs
index 2487a02f..d56e7c88 100644
--- a/helix-term/src/application.rs
+++ b/helix-term/src/application.rs
@@ -928,24 +928,32 @@ impl Application {
Call::MethodCall(helix_lsp::jsonrpc::MethodCall {
method, params, id, ..
}) => {
- let call = match MethodCall::parse(&method, params) {
- Ok(call) => call,
+ let reply = match MethodCall::parse(&method, params) {
Err(helix_lsp::Error::Unhandled) => {
- error!("Language Server: Method not found {}", method);
- return;
+ error!(
+ "Language Server: Method {} not found in request {}",
+ method, id
+ );
+ Err(helix_lsp::jsonrpc::Error {
+ code: helix_lsp::jsonrpc::ErrorCode::MethodNotFound,
+ message: format!("Method not found: {}", method),
+ data: None,
+ })
}
Err(err) => {
log::error!(
- "received malformed method call from Language Server: {}: {}",
+ "Language Server: Received malformed method call {} in request {}: {}",
method,
+ id,
err
);
- return;
+ Err(helix_lsp::jsonrpc::Error {
+ code: helix_lsp::jsonrpc::ErrorCode::ParseError,
+ message: format!("Malformed method call: {}", method),
+ data: None,
+ })
}
- };
-
- let reply = match call {
- MethodCall::WorkDoneProgressCreate(params) => {
+ Ok(MethodCall::WorkDoneProgressCreate(params)) => {
self.lsp_progress.create(server_id, params.token);
let editor_view = self
@@ -959,7 +967,7 @@ impl Application {
Ok(serde_json::Value::Null)
}
- MethodCall::ApplyWorkspaceEdit(params) => {
+ Ok(MethodCall::ApplyWorkspaceEdit(params)) => {
apply_workspace_edit(
&mut self.editor,
helix_lsp::OffsetEncoding::Utf8,
@@ -972,13 +980,13 @@ impl Application {
failed_change: None,
}))
}
- MethodCall::WorkspaceFolders => {
+ Ok(MethodCall::WorkspaceFolders) => {
let language_server =
self.editor.language_servers.get_by_id(server_id).unwrap();
Ok(json!(language_server.workspace_folders()))
}
- MethodCall::WorkspaceConfiguration(params) => {
+ Ok(MethodCall::WorkspaceConfiguration(params)) => {
let result: Vec<_> = params
.items
.iter()