Compare commits

..

No commits in common. "main" and "v0.10" have entirely different histories.
main ... v0.10

5 changed files with 20 additions and 27 deletions

View file

@ -1,9 +1,4 @@
# 0.11
- breaking: the Eio library now needs the output channel to be paired with
an `Eio.Mutex.t` to prevent race conditions (#58)
# 0.10
- use `git subtree` to vendor lsp+jsonrpc, so that they

View file

@ -24,7 +24,7 @@
(synopsis "LSP server library")
(depends
("yojson"
(and (>= "1.6") (< "3.0")))
(>= "1.6"))
"logs"
("trace"
(>= "0.4"))

View file

@ -37,7 +37,7 @@ let diagnostics (_state : state_after_processing) : Lsp.Types.Diagnostic.t list
so that users only need to override methods that they want the server to
actually meaningfully interpret and respond to.
*)
class lsp_server ~(sw: Eio.Switch.t) =
class lsp_server =
object (self)
inherit Linol_eio.Jsonrpc2.server
@ -45,7 +45,7 @@ class lsp_server ~(sw: Eio.Switch.t) =
val buffers : (Lsp.Types.DocumentUri.t, state_after_processing) Hashtbl.t =
Hashtbl.create 32
method spawn_query_handler f = Linol_eio.spawn ~sw f
method spawn_query_handler f = Linol_eio.spawn f
(* We define here a helper method that will:
- process a document
@ -82,8 +82,7 @@ class lsp_server ~(sw: Eio.Switch.t) =
and runs it as a task. *)
let run () =
Eio_main.run @@ fun env ->
Eio.Switch.run @@ fun sw ->
let s = new lsp_server ~sw in
let s = new lsp_server in
let server = Linol_eio.Jsonrpc2.create_stdio ~env s in
let task () =
let shutdown () = s#get_status = `ReceivedExit in

View file

@ -9,7 +9,7 @@ homepage: "https://github.com/c-cube/linol"
bug-reports: "https://github.com/c-cube/linol/issues"
depends: [
"dune" {>= "2.0"}
"yojson" {>= "1.6" & < "3.0"}
"yojson" {>= "1.6"}
"logs"
"trace" {>= "0.4"}
"ocaml" {>= "4.14"}

View file

@ -9,7 +9,7 @@ module IO_eio :
with type 'a t = 'a
and type env = Eio_unix.Stdenv.base
and type in_channel = Eio.Buf_read.t
and type out_channel = Eio.Mutex.t * Eio_unix.sink_ty Eio.Std.r = struct
and type out_channel = Eio_unix.sink_ty Eio.Std.r = struct
type 'a t = 'a
let ( let+ ) x f = f x
@ -28,21 +28,17 @@ module IO_eio :
let stdin env =
Eio.Buf_read.of_flow ~max_size:1_000_000 (Eio.Stdenv.stdin env)
let stdout_mutex = Eio.Mutex.create ()
let stdout env = stdout_mutex, Eio.Stdenv.stdout env
let stdout = Eio.Stdenv.stdout
type env = Eio_unix.Stdenv.base
type in_channel = Eio.Buf_read.t
type out_channel = Eio.Mutex.t * Eio_unix.sink_ty Eio.Std.r
type out_channel = Eio_unix.sink_ty Eio.Std.r
let write_string (mutex, out_ch) str =
Eio.Mutex.use_rw ~protect:false mutex (fun () ->
Eio.Flow.copy_string str out_ch)
let write_string out_ch str = Eio.Flow.copy_string str out_ch
let write (mutex, out_ch) bytes off len =
Eio.Mutex.use_rw ~protect:false mutex (fun () ->
Eio.Buf_write.with_flow out_ch @@ fun w ->
Eio.Buf_write.bytes w ~off ~len bytes)
let write out_ch bytes off len =
Eio.Buf_write.with_flow out_ch @@ fun w ->
Eio.Buf_write.bytes w ~off ~len bytes
let read in_ch bytes off len =
let str = Eio.Buf_read.take len in_ch in
@ -52,14 +48,17 @@ module IO_eio :
end
(** Spawn function. *)
let spawn ~sw f =
Eio.Fiber.fork ~sw (fun () ->
try
f ()
let spawn f =
let promise, resolver = Eio.Promise.create () in
(try
f ();
Eio.Promise.resolve_ok resolver ()
with exn ->
Printf.eprintf "uncaught exception in `spawn`:\n%s\n%!"
(Printexc.to_string exn);
raise exn)
Eio.Promise.resolve_error resolver exn);
Eio.Promise.await_exn promise
include Lsp.Types
include IO_eio