From cfe014a5a2a8d65d85036e7216a28371454616b9 Mon Sep 17 00:00:00 2001 From: StepBroBD Date: Mon, 23 Jun 2025 10:41:51 +0200 Subject: [PATCH] ocamlPackages.linol: 0.6 -> 0.10 (#399596) * ocamlPackages.linol: 0.6 -> 0.10 * ocamlPackages.dolmen_lsp: fix transitive dependency and migrate to linol common types --- .../dolmen/linol-common-migration.patch | 137 ++++++++++++++++++ .../ocaml-modules/dolmen/linol-lwt-6.patch | 43 ------ pkgs/development/ocaml-modules/dolmen/lsp.nix | 6 +- .../ocaml-modules/linol/default.nix | 30 ++-- pkgs/development/ocaml-modules/linol/eio.nix | 21 +++ pkgs/development/ocaml-modules/linol/lwt.nix | 2 - pkgs/top-level/ocaml-packages.nix | 2 + 7 files changed, 181 insertions(+), 60 deletions(-) create mode 100644 pkgs/development/ocaml-modules/dolmen/linol-common-migration.patch delete mode 100644 pkgs/development/ocaml-modules/dolmen/linol-lwt-6.patch create mode 100644 pkgs/development/ocaml-modules/linol/eio.nix diff --git a/pkgs/development/ocaml-modules/dolmen/linol-common-migration.patch b/pkgs/development/ocaml-modules/dolmen/linol-common-migration.patch new file mode 100644 index 000000000000..cad42e5eb8a3 --- /dev/null +++ b/pkgs/development/ocaml-modules/dolmen/linol-common-migration.patch @@ -0,0 +1,137 @@ +diff --git i/src/lsp/diagnostic.ml w/src/lsp/diagnostic.ml +index 149cde11..bd93298a 100644 +--- i/src/lsp/diagnostic.ml ++++ w/src/lsp/diagnostic.ml +@@ -1,13 +1,12 @@ +- + (* This file is free software, part of dolmen. See file "LICENSE" for more information *) + +-type t = Lsp.Types.Diagnostic.t ++type t = Linol__.Common_.Lsp.Types.Diagnostic.t + + let lsp_pos line character = +- Lsp.Types.Position.create ~line ~character ++ Linol__.Common_.Lsp.Types.Position.create ~line ~character + + let lsp_range start end_ = +- Lsp.Types.Range.create ~start ~end_ ++ Linol__.Common_.Lsp.Types.Range.create ~start ~end_ + + let start_pos = lsp_pos 1 1 + let start_range = lsp_range start_pos start_pos +@@ -23,17 +22,15 @@ let range_of_loc = function + (lsp_pos (l.stop_line - 1) l.stop_column) + + let warn ?loc message = +- Lsp.Types.Diagnostic.create () ++ Linol__.Common_.Lsp.Types.Diagnostic.create () + ~range:(range_of_loc loc) + ~severity:Warning + ~source:"dolmenls" + ~message + + let error ?loc message = +- Lsp.Types.Diagnostic.create () ++ Linol__.Common_.Lsp.Types.Diagnostic.create () + ~range:(range_of_loc loc) + ~severity:Error + ~source:"dolmenls" + ~message +- +- +diff --git i/src/lsp/main.ml w/src/lsp/main.ml +index 8d6fc760..b52dd25c 100644 +--- i/src/lsp/main.ml ++++ w/src/lsp/main.ml +@@ -3,7 +3,7 @@ + + let run () = + let s = new Server.dolmen_lsp_server in +- let server = Linol_lwt.Jsonrpc2.create_stdio s in ++ let server = Linol_lwt.Jsonrpc2.create_stdio ~env:() s in + let task = Linol_lwt.Jsonrpc2.run server in + match Linol_lwt.run task with + | () -> () +diff --git i/src/lsp/server.ml w/src/lsp/server.ml +index e895cc6a..a01ed9fb 100644 +--- i/src/lsp/server.ml ++++ w/src/lsp/server.ml +@@ -44,25 +44,28 @@ class dolmen_lsp_server = + object(self) + inherit Linol_lwt.Jsonrpc2.server + ++ method spawn_query_handler f = Linol_lwt.spawn f ++ + (* one env per document *) +- val buffers: (Lsp.Types.DocumentUri.t, State.t) Hashtbl.t = Hashtbl.create 32 ++ val buffers: (Linol__.Common_.Lsp.Types.DocumentUri.t, State.t) Hashtbl.t = Hashtbl.create 32 + + (* A list of include statements of the prelude files *) + val mutable prelude = [] + + method! config_sync_opts = + (* configure how sync happens *) +- let change = Lsp.Types.TextDocumentSyncKind.Incremental in +- (* Lsp.Types.TextDocumentSyncKind.Full *) +- Lsp.Types.TextDocumentSyncOptions.create ~openClose:true ~change +- ~save:(Lsp.Types.SaveOptions.create ~includeText:false ()) ++ let change = Linol__.Common_.Lsp.Types.TextDocumentSyncKind.Incremental in ++ (* Linol__.Common_.Lsp.Types.TextDocumentSyncKind.Full *) ++ Linol__.Common_.Lsp.Types.TextDocumentSyncOptions.create ~openClose:true ~change ++ ~save:(`SaveOptions (Linol__.Common_.Lsp.Types.SaveOptions.create ~includeText:false ())) + () + + method private _on_doc + ~(notify_back:Linol_lwt.Jsonrpc2.notify_back) +- (uri:Lsp.Types.DocumentUri.t) (contents:string) = ++ (uri:Linol__.Common_.Lsp.Types.DocumentUri.t) (contents:string) = + (* TODO: unescape uri/translate it to a correct path ? *) +- match Loop.process prelude (preprocess_uri uri) (Some contents) with ++ let uri_path = Linol__.Common_.Lsp.Uri.to_path uri in ++ match Loop.process prelude (preprocess_uri uri_path) (Some contents) with + | Ok state -> + let diags = State.get State.diagnostics state in + Hashtbl.replace buffers uri state; +@@ -79,9 +82,9 @@ class dolmen_lsp_server = + self#_on_doc ~notify_back d.uri new_content + + method! on_notification_unhandled +- ~notify_back:_ (n:Lsp.Client_notification.t) = ++ ~notify_back:_ (n:Linol__.Common_.Lsp.Client_notification.t) = + match n with +- | Lsp.Client_notification.ChangeConfiguration { settings; } -> ++ | Linol__.Common_.Lsp.Client_notification.ChangeConfiguration { settings; } -> + begin try + prelude <- mk_prelude (parse_settings settings); + Linol_lwt.Jsonrpc2.IO.return () +@@ -89,7 +92,7 @@ class dolmen_lsp_server = + Linol_lwt.Jsonrpc2.IO.failwith s + end + | _ -> +- Lwt.return () ++ Linol_lwt.Jsonrpc2.IO.return () + + method on_notif_doc_did_close ~notify_back d = + Hashtbl.remove buffers d.uri; +diff --git i/src/lsp/state.ml w/src/lsp/state.ml +index f3e89640..3f8a36ab 100644 +--- i/src/lsp/state.ml ++++ w/src/lsp/state.ml +@@ -45,7 +45,7 @@ let warn ?file:_ ?loc t warn payload = + in + Format.kfprintf (fun _ -> + let msg = Format.flush_str_formatter () in +- let d = Diagnostic.warn ~loc msg in ++ let d = Diagnostic.warn ~loc (`String msg) in + add_diag d t) Format.str_formatter "%a" + Dolmen_loop.Report.Warning.print (warn, payload) + +@@ -67,7 +67,7 @@ let error ?file:_ ?loc t err payload = + (* Print the error message *) + Format.kfprintf (fun _ -> + let msg = Format.flush_str_formatter () in +- let d = Diagnostic.error ~loc msg in ++ let d = Diagnostic.error ~loc (`String msg) in + add_diag d t) Format.str_formatter "%a" + Dolmen_loop.Report.Error.print (err, payload) + diff --git a/pkgs/development/ocaml-modules/dolmen/linol-lwt-6.patch b/pkgs/development/ocaml-modules/dolmen/linol-lwt-6.patch deleted file mode 100644 index b92bfa46cd66..000000000000 --- a/pkgs/development/ocaml-modules/dolmen/linol-lwt-6.patch +++ /dev/null @@ -1,43 +0,0 @@ -diff --git a/src/lsp/main.ml b/src/lsp/main.ml -index 8d6fc760..b52dd25c 100644 ---- a/src/lsp/main.ml -+++ b/src/lsp/main.ml -@@ -3,7 +3,7 @@ - - let run () = - let s = new Server.dolmen_lsp_server in -- let server = Linol_lwt.Jsonrpc2.create_stdio s in -+ let server = Linol_lwt.Jsonrpc2.create_stdio ~env:() s in - let task = Linol_lwt.Jsonrpc2.run server in - match Linol_lwt.run task with - | () -> () -diff --git a/src/lsp/server.ml b/src/lsp/server.ml -index e895cc6a..c9a3f237 100644 ---- a/src/lsp/server.ml -+++ b/src/lsp/server.ml -@@ -44,6 +44,8 @@ class dolmen_lsp_server = - object(self) - inherit Linol_lwt.Jsonrpc2.server - -+ method spawn_query_handler _ = () -+ - (* one env per document *) - val buffers: (Lsp.Types.DocumentUri.t, State.t) Hashtbl.t = Hashtbl.create 32 - -@@ -55,14 +57,14 @@ class dolmen_lsp_server = - let change = Lsp.Types.TextDocumentSyncKind.Incremental in - (* Lsp.Types.TextDocumentSyncKind.Full *) - Lsp.Types.TextDocumentSyncOptions.create ~openClose:true ~change -- ~save:(Lsp.Types.SaveOptions.create ~includeText:false ()) -+ ~save:(`SaveOptions (Lsp.Types.SaveOptions.create ~includeText:false ())) - () - - method private _on_doc - ~(notify_back:Linol_lwt.Jsonrpc2.notify_back) - (uri:Lsp.Types.DocumentUri.t) (contents:string) = - (* TODO: unescape uri/translate it to a correct path ? *) -- match Loop.process prelude (preprocess_uri uri) (Some contents) with -+ match Loop.process prelude (preprocess_uri (Lsp.Types.DocumentUri.to_string uri)) (Some contents) with - | Ok state -> - let diags = State.get State.diagnostics state in - Hashtbl.replace buffers uri state; diff --git a/pkgs/development/ocaml-modules/dolmen/lsp.nix b/pkgs/development/ocaml-modules/dolmen/lsp.nix index 5d92bd1278ed..97bb68cdd746 100644 --- a/pkgs/development/ocaml-modules/dolmen/lsp.nix +++ b/pkgs/development/ocaml-modules/dolmen/lsp.nix @@ -7,14 +7,14 @@ linol, linol-lwt, logs, -# lsp, # transitive dependency from linol + lsp, }: buildDunePackage { pname = "dolmen_lsp"; inherit (dolmen) src version; - patches = [ ./linol-lwt-6.patch ]; + patches = [ ./linol-common-migration.patch ]; buildInputs = [ dolmen @@ -23,7 +23,7 @@ buildDunePackage { linol linol-lwt logs - # lsp # transitive dependency from linol + lsp ]; meta = dolmen.meta // { diff --git a/pkgs/development/ocaml-modules/linol/default.nix b/pkgs/development/ocaml-modules/linol/default.nix index 3d0f513cad5b..7b41c28b9d6a 100644 --- a/pkgs/development/ocaml-modules/linol/default.nix +++ b/pkgs/development/ocaml-modules/linol/default.nix @@ -1,37 +1,43 @@ { lib, - fetchurl, + fetchFromGitHub, buildDunePackage, - yojson, logs, - lsp, ppx_yojson_conv_lib, trace, + uutf, + yojson, }: buildDunePackage rec { pname = "linol"; - version = "0.6"; + version = "0.10"; minimalOCamlVersion = "4.14"; - src = fetchurl { - url = "https://github.com/c-cube/linol/releases/download/v${version}/linol-${version}.tbz"; - hash = "sha256-MwEisPJdzZN1VRnssotvExNMYOQdffS+Y2B8ZSUDVfo="; + src = fetchFromGitHub { + owner = "c-cube"; + repo = "linol"; + tag = "v${version}"; + hash = "sha256-G/5nTJd+MxPgNObKW2Hmmwn4HejQ81c3f4oVXjpNSZg="; }; propagatedBuildInputs = [ - yojson logs - (lsp.override { version = "1.18.0"; }) ppx_yojson_conv_lib trace + uutf + yojson ]; - meta = with lib; { + meta = { description = "LSP server library"; - license = licenses.mit; - maintainers = [ maintainers.ulrikstrid ]; homepage = "https://github.com/c-cube/linol"; + changelog = "https://raw.githubusercontent.com/c-cube/linol/refs/tags/v${version}/CHANGES.md"; + license = lib.licenses.mit; + maintainers = with lib.maintainers; [ + stepbrobd + ulrikstrid + ]; }; } diff --git a/pkgs/development/ocaml-modules/linol/eio.nix b/pkgs/development/ocaml-modules/linol/eio.nix new file mode 100644 index 000000000000..807f6d744284 --- /dev/null +++ b/pkgs/development/ocaml-modules/linol/eio.nix @@ -0,0 +1,21 @@ +{ + buildDunePackage, + eio, + linol, + yojson, +}: + +buildDunePackage { + pname = "linol-eio"; + inherit (linol) version src; + + propagatedBuildInputs = [ + eio + linol + yojson + ]; + + meta = linol.meta // { + description = "LSP server library (with Eio for concurrency)"; + }; +} diff --git a/pkgs/development/ocaml-modules/linol/lwt.nix b/pkgs/development/ocaml-modules/linol/lwt.nix index a8c211be0ba6..f757db90ee6e 100644 --- a/pkgs/development/ocaml-modules/linol/lwt.nix +++ b/pkgs/development/ocaml-modules/linol/lwt.nix @@ -1,7 +1,6 @@ { buildDunePackage, linol, - jsonrpc, lwt, yojson, }: @@ -12,7 +11,6 @@ buildDunePackage { propagatedBuildInputs = [ linol - jsonrpc lwt yojson ]; diff --git a/pkgs/top-level/ocaml-packages.nix b/pkgs/top-level/ocaml-packages.nix index 7a2e21f7941a..96fefa20d8ad 100644 --- a/pkgs/top-level/ocaml-packages.nix +++ b/pkgs/top-level/ocaml-packages.nix @@ -1042,6 +1042,8 @@ let linol = callPackage ../development/ocaml-modules/linol { }; + linol-eio = callPackage ../development/ocaml-modules/linol/eio.nix { }; + linol-lwt = callPackage ../development/ocaml-modules/linol/lwt.nix { }; llvm = callPackage ../development/ocaml-modules/llvm {