diff --git a/CHANGES.md b/CHANGES.md index 96b8a73405..e28de7653d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,14 @@ +merlin 4.16 +=========== +Mon Jun 10 17:35:42 CEST 2024 + + + merlin binary + - Addition of a `merlin-lib.commands` library which disassociates the + execution of commands from the `new_protocol`, from the binary, allowing + it to be invoked from other projects (#1758) + - `merlin-lib.commands`: Add a `find_command_opt` alternative to + `find_command` that does not raise (#1778) + merlin 4.15 =========== Fri May 31 14:02:42 CEST 2024 diff --git a/src/commands/dune b/src/commands/dune new file mode 100644 index 0000000000..016727ba05 --- /dev/null +++ b/src/commands/dune @@ -0,0 +1,14 @@ +(library + (name merlin_commands) + (public_name merlin-lib.commands) + (flags + :standard + -open Ocaml_parsing + -open Merlin_utils + -open Merlin_kernel) + (libraries + merlin-lib.ocaml_parsing + merlin-lib.utils + merlin-lib.kernel + merlin-lib.query_protocol + merlin-lib.query_commands)) diff --git a/src/frontend/ocamlmerlin/new/new_commands.ml b/src/commands/new_commands.ml similarity index 93% rename from src/frontend/ocamlmerlin/new/new_commands.ml rename to src/commands/new_commands.ml index a1b753dd7d..4491ae9f25 100644 --- a/src/frontend/ocamlmerlin/new/new_commands.ml +++ b/src/commands/new_commands.ml @@ -1,3 +1,32 @@ +(* {{{ COPYING *( + + This file is part of Merlin, an helper for ocaml editors + + Copyright (C) 2013 - 2015 Frédéric Bour + Thomas Refis + Simon Castellan + Tomasz Kołodziejski + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + The Software is provided "as is", without warranty of any kind, express or + implied, including but not limited to the warranties of merchantability, + fitness for a particular purpose and noninfringement. In no event shall + the authors or copyright holders be liable for any claim, damages or other + liability, whether in an action of contract, tort or otherwise, arising + from, out of or in connection with the software or the use or other dealings + in the Software. + +)* }}} *) + open Std type command = @@ -52,12 +81,11 @@ let marg_completion_kind f = Marg.param "completion-kind" str ) -let rec find_command name = function - | [] -> raise Not_found - | (Command (name', _, _, _, _) as command) :: xs -> - if name = name' then - command - else find_command name xs +let command_is ~name (Command (name', _, _, _, _)) = String.equal name name' + +let find_command name = List.find ~f:(command_is ~name) + +let find_command_opt name = List.find_opt ~f:(command_is ~name) let run pipeline query = Logger.log ~section:"New_commands" ~title:"run(query)" @@ -207,9 +235,9 @@ Otherwise, Merlin looks for the documentation for the entity under the cursor (a ] ~default: `None begin fun buffer pos -> - match pos with + match pos with | `None -> failwith "-position is mandatory" - | #Msource.position as pos -> + | #Msource.position as pos -> run buffer (Query_protocol.Syntax_document pos) end ; diff --git a/src/commands/new_commands.mli b/src/commands/new_commands.mli new file mode 100644 index 0000000000..7c62b49d8f --- /dev/null +++ b/src/commands/new_commands.mli @@ -0,0 +1,44 @@ +(* {{{ COPYING *( + + This file is part of Merlin, an helper for ocaml editors + + Copyright (C) 2013 - 2015 Frédéric Bour + Thomas Refis + Simon Castellan + Tomasz Kołodziejski + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + The Software is provided "as is", without warranty of any kind, express or + implied, including but not limited to the warranties of merchantability, + fitness for a particular purpose and noninfringement. In no event shall + the authors or copyright holders be liable for any claim, damages or other + liability, whether in an action of contract, tort or otherwise, arising + from, out of or in connection with the software or the use or other dealings + in the Software. + +)* }}} *) + +open Std + +type command = + Command : string * Marg.docstring * ([`Mandatory|`Optional|`Many] * 'args Marg.spec) list * 'args * + (Mpipeline.t -> 'args -> json) -> command + +val all_commands : command list + +(** [find_command name cmds] returns the command with name [name] in the list + [cmds] if it exists. Raises [Not_found] if it does not. *) +val find_command : string -> command list -> command + +(** [find_command name cmds] optionaly returns the command with name [name] if + it is in the list [cmds]. *) +val find_command_opt : string -> command list -> command option diff --git a/src/frontend/ocamlmerlin/query_json.ml b/src/commands/query_json.ml similarity index 100% rename from src/frontend/ocamlmerlin/query_json.ml rename to src/commands/query_json.ml diff --git a/src/frontend/ocamlmerlin/dune b/src/frontend/ocamlmerlin/dune index e8ab3eccdd..409c71c0c2 100644 --- a/src/frontend/ocamlmerlin/dune +++ b/src/frontend/ocamlmerlin/dune @@ -12,12 +12,13 @@ -open Merlin_kernel -open Merlin_utils -open Merlin_analysis - -open Merlin_kernel) + -open Merlin_kernel + -open Merlin_commands) (modules (:standard \ gen_ccflags)) (libraries merlin-lib.config yojson merlin-lib.analysis merlin-lib.kernel merlin-lib.utils merlin-lib.os_ipc merlin-lib.ocaml_parsing merlin-lib.query_protocol merlin-lib.query_commands - merlin-lib.ocaml_typing merlin-lib.ocaml_utils)) + merlin-lib.ocaml_typing merlin-lib.ocaml_utils merlin-lib.commands)) (executable (name gen_ccflags) diff --git a/src/frontend/ocamlmerlin/new/new_commands.mli b/src/frontend/ocamlmerlin/new/new_commands.mli deleted file mode 100644 index 2c6498aa25..0000000000 --- a/src/frontend/ocamlmerlin/new/new_commands.mli +++ /dev/null @@ -1,9 +0,0 @@ -open Std - -type command = - Command : string * Marg.docstring * ([`Mandatory|`Optional|`Many] * 'args Marg.spec) list * 'args * - (Mpipeline.t -> 'args -> json) -> command - -val all_commands : command list - -val find_command : string -> command list -> command