From cd967617498a9aa0c334d21791d54b8d893d7810 Mon Sep 17 00:00:00 2001 From: Ulugbek Abdullaev Date: Wed, 26 Oct 2022 22:29:32 +0500 Subject: [PATCH 1/4] fix(go-to-def): send a response with an error for failing go-to-def/go-to-decl/go-to-type-def rather than sending a notification afterwards with the error --- ocaml-lsp-server/src/ocaml_lsp_server.ml | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/ocaml-lsp-server/src/ocaml_lsp_server.ml b/ocaml-lsp-server/src/ocaml_lsp_server.ml index 71fb46765..8056dc842 100644 --- a/ocaml-lsp-server/src/ocaml_lsp_server.ml +++ b/ocaml-lsp-server/src/ocaml_lsp_server.ml @@ -590,7 +590,7 @@ let references (state : State.t) (* using original uri because merlin is looking only in local file *) { Location.uri; range })) -let definition_query server (state : State.t) uri position merlin_request = +let definition_query (state : State.t) uri position merlin_request = let doc = Document_store.get state.store uri in match Document.kind doc with | `Other -> Fiber.return None @@ -601,11 +601,12 @@ let definition_query server (state : State.t) uri position merlin_request = match location_of_merlin_loc uri result with | Ok s -> Fiber.return s | Error message -> - let+ () = - let message = sprintf "Locate failed. %s" message in - State.log_msg server ~type_:Error ~message - in - None) + let message = sprintf "Merlin Locate failed: %s" message in + Jsonrpc.Response.Error.raise + (Jsonrpc.Response.Error.make + ~code:Jsonrpc.Response.Error.Code.InternalError + ~message + ())) let workspace_symbol server (state : State.t) (params : WorkspaceSymbolParams.t) = @@ -809,19 +810,19 @@ let on_request : | TextDocumentDeclaration { textDocument = { uri }; position } -> later (fun state () -> - definition_query rpc state uri position (fun pos -> + definition_query state uri position (fun pos -> Query_protocol.Locate (None, `MLI, pos))) () | TextDocumentDefinition { textDocument = { uri }; position; _ } -> later (fun state () -> - definition_query rpc state uri position (fun pos -> + definition_query state uri position (fun pos -> Query_protocol.Locate (None, `ML, pos))) () | TextDocumentTypeDefinition { textDocument = { uri }; position; _ } -> later (fun state () -> - definition_query rpc state uri position (fun pos -> + definition_query state uri position (fun pos -> Query_protocol.Locate_type pos)) () | TextDocumentCompletion params -> From 0dc223fd170b99403e5d200bd63608e8327b6934 Mon Sep 17 00:00:00 2001 From: Ulugbek Abdullaev Date: Thu, 27 Oct 2022 13:25:10 +0500 Subject: [PATCH 2/4] . --- ocaml-lsp-server/src/ocaml_lsp_server.ml | 41 +++++++++++++----------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/ocaml-lsp-server/src/ocaml_lsp_server.ml b/ocaml-lsp-server/src/ocaml_lsp_server.ml index 8056dc842..6d9f2aa5f 100644 --- a/ocaml-lsp-server/src/ocaml_lsp_server.ml +++ b/ocaml-lsp-server/src/ocaml_lsp_server.ml @@ -590,22 +590,35 @@ let references (state : State.t) (* using original uri because merlin is looking only in local file *) { Location.uri; range })) -let definition_query (state : State.t) uri position merlin_request = +let definition_query kind (state : State.t) uri position = let doc = Document_store.get state.store uri in match Document.kind doc with | `Other -> Fiber.return None | `Merlin doc -> ( - let position = Position.logical position in - let command = merlin_request position in + let command = + let pos = Position.logical position in + match kind with + | `Definition -> Query_protocol.Locate (None, `ML, pos) + | `Declaration -> Query_protocol.Locate (None, `MLI, pos) + | `Type_definition -> Query_protocol.Locate_type pos + in let* result = Document.Merlin.dispatch_exn doc command in match location_of_merlin_loc uri result with | Ok s -> Fiber.return s - | Error message -> - let message = sprintf "Merlin Locate failed: %s" message in + | Error err_msg -> + let kind = + match kind with + | `Definition -> "definition" + | `Declaration -> "declaration" + | `Type_definition -> "type definition" + in Jsonrpc.Response.Error.raise (Jsonrpc.Response.Error.make ~code:Jsonrpc.Response.Error.Code.InternalError - ~message + ~message:(sprintf "Request \"Jump to %s\" failed." kind) + ~data: + (`String + (sprintf "'Locate' query to merlin returned error: %s" err_msg)) ())) let workspace_symbol server (state : State.t) (params : WorkspaceSymbolParams.t) @@ -808,22 +821,12 @@ let on_request : | TextDocumentHighlight req -> later highlight req | DocumentSymbol { textDocument = { uri }; _ } -> later document_symbol uri | TextDocumentDeclaration { textDocument = { uri }; position } -> - later - (fun state () -> - definition_query state uri position (fun pos -> - Query_protocol.Locate (None, `MLI, pos))) - () + later (fun state () -> definition_query `Declaration state uri position) () | TextDocumentDefinition { textDocument = { uri }; position; _ } -> - later - (fun state () -> - definition_query state uri position (fun pos -> - Query_protocol.Locate (None, `ML, pos))) - () + later (fun state () -> definition_query `Definition state uri position) () | TextDocumentTypeDefinition { textDocument = { uri }; position; _ } -> later - (fun state () -> - definition_query state uri position (fun pos -> - Query_protocol.Locate_type pos)) + (fun state () -> definition_query `Type_definition state uri position) () | TextDocumentCompletion params -> later (fun _ () -> Compl.complete state params) () From ffc909026c960826136cf9b1675bda3e4df4a09a Mon Sep 17 00:00:00 2001 From: Ulugbek Abdullaev Date: Thu, 27 Oct 2022 13:25:58 +0500 Subject: [PATCH 3/4] . --- ocaml-lsp-server/src/ocaml_lsp_server.ml | 1 + 1 file changed, 1 insertion(+) diff --git a/ocaml-lsp-server/src/ocaml_lsp_server.ml b/ocaml-lsp-server/src/ocaml_lsp_server.ml index 6d9f2aa5f..50dab1d1b 100644 --- a/ocaml-lsp-server/src/ocaml_lsp_server.ml +++ b/ocaml-lsp-server/src/ocaml_lsp_server.ml @@ -591,6 +591,7 @@ let references (state : State.t) { Location.uri; range })) let definition_query kind (state : State.t) uri position = + let* () = Fiber.return () in let doc = Document_store.get state.store uri in match Document.kind doc with | `Other -> Fiber.return None From be3a1be086046d62ee462ce0507c3f4b45bbf45c Mon Sep 17 00:00:00 2001 From: Ulugbek Abdullaev Date: Thu, 27 Oct 2022 13:26:42 +0500 Subject: [PATCH 4/4] . --- ocaml-lsp-server/src/ocaml_lsp_server.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ocaml-lsp-server/src/ocaml_lsp_server.ml b/ocaml-lsp-server/src/ocaml_lsp_server.ml index 50dab1d1b..cefb1ac90 100644 --- a/ocaml-lsp-server/src/ocaml_lsp_server.ml +++ b/ocaml-lsp-server/src/ocaml_lsp_server.ml @@ -615,7 +615,7 @@ let definition_query kind (state : State.t) uri position = in Jsonrpc.Response.Error.raise (Jsonrpc.Response.Error.make - ~code:Jsonrpc.Response.Error.Code.InternalError + ~code:Jsonrpc.Response.Error.Code.RequestFailed ~message:(sprintf "Request \"Jump to %s\" failed." kind) ~data: (`String