linol/thirdparty/lsp/ocaml-lsp-server/test/e2e-new/lsp_helpers.ml

61 lines
1.7 KiB
OCaml

open Test.Import
let change_config ~client params = Client.notification client (ChangeConfiguration params)
let open_document ~client ~uri ~source =
let textDocument =
TextDocumentItem.create ~uri ~languageId:"ocaml" ~version:0 ~text:source
in
Client.notification
client
(TextDocumentDidOpen (DidOpenTextDocumentParams.create ~textDocument))
;;
let iter_lsp_response
?(prep = fun _ -> Fiber.return ())
?(path = "foo.ml")
~makeRequest
~source
k
=
let got_diagnostics = Fiber.Ivar.create () in
let handler =
Client.Handler.make
~on_notification:(fun _ -> function
| PublishDiagnostics _ ->
let* diag = Fiber.Ivar.peek got_diagnostics in
(match diag with
| Some _ -> Fiber.return ()
| None -> Fiber.Ivar.fill got_diagnostics ())
| _ -> Fiber.return ())
()
in
Test.run ~handler
@@ fun client ->
let run_client () =
let capabilities =
let window =
let showDocument = ShowDocumentClientCapabilities.create ~support:true in
WindowClientCapabilities.create ~showDocument ()
in
ClientCapabilities.create ~window ()
in
Client.start client (InitializeParams.create ~capabilities ())
in
let run =
let* (_ : InitializeResult.t) = Client.initialized client in
let uri = DocumentUri.of_path path in
let* () = prep client in
let* () = open_document ~client ~uri ~source in
let+ resp =
let request =
let textDocument = TextDocumentIdentifier.create ~uri in
makeRequest textDocument
in
Client.request client request
in
k resp
in
Fiber.fork_and_join_unit run_client (fun () ->
run >>> Fiber.Ivar.read got_diagnostics >>> Client.stop client)
;;