diff --git a/example/template/main.ml b/example/template/main.ml index e1ad9188..3e085ccb 100644 --- a/example/template/main.ml +++ b/example/template/main.ml @@ -81,7 +81,10 @@ class lsp_server = let run () = let s = new lsp_server in let server = Linol_lwt.Jsonrpc2.create_stdio s in - let task = Linol_lwt.Jsonrpc2.run server in + let task = + let shutdown () = s#get_status = `ReceivedExit in + Linol_lwt.Jsonrpc2.run ~shutdown server + in match Linol_lwt.run task with | () -> () | exception e -> diff --git a/src/jsonrpc2.ml b/src/jsonrpc2.ml index dc0c52a8..79b973bb 100644 --- a/src/jsonrpc2.ml +++ b/src/jsonrpc2.ml @@ -302,6 +302,10 @@ module Make (IO : IO) : S with module IO = IO = struct IO.return @@ Error (E (ErrorCode.InvalidRequest, "content-type must be 'utf-8'")) + (** [shutdown ()] is called after processing each request to check if the server + could wait for new messages. + When launching an LSP server using [Server.Make.server], the + natural choice for it is [s#get_status = `ReceivedExit] *) let run ?(shutdown = fun _ -> false) (self : t) : unit IO.t = let process_msg r = let module M = Jsonrpc.Packet in diff --git a/src/server.ml b/src/server.ml index eb44de86..1e8ec4bc 100644 --- a/src/server.ml +++ b/src/server.ml @@ -157,9 +157,14 @@ module Make (IO : IO) = struct class virtual server = object (self) inherit base_server - val mutable _quit = false + + val mutable status : [ `Running | `ReceivedShutdown | `ReceivedExit ] = + `Running + val docs : (DocumentUri.t, doc_state) Hashtbl.t = Hashtbl.create 16 - method! must_quit = _quit + method get_status = status + (** Check if exit or shutdown request was made by the client. + @since NEXT_RELEASE *) method find_doc (uri : DocumentUri.t) : doc_state option = try Some (Hashtbl.find docs uri) with Not_found -> None @@ -313,7 +318,7 @@ module Make (IO : IO) = struct match r with | Lsp.Client_request.Shutdown -> Log.info (fun k -> k "shutdown"); - _quit <- true; + status <- `ReceivedShutdown; IO.return () | Lsp.Client_request.Initialize i -> Log.debug (fun k -> k "req: initialize"); @@ -583,7 +588,7 @@ module Make (IO : IO) = struct ~old_content:(Lsp.Text_document.text old_doc) ~new_content:new_st.content | Lsp.Client_notification.Exit -> - _quit <- true; + status <- `ReceivedExit; IO.return () | Lsp.Client_notification.DidSaveTextDocument _ | Lsp.Client_notification.WillSaveTextDocument _