this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Split worker in lib/bin

+231 -32
+14
src/worker/bin/dune
··· 1 + (env 2 + (_ (js_of_ocaml (compilation_mode whole_program)))) 3 + 4 + (executable 5 + (name merlin_worker) 6 + (modules merlin_worker) 7 + (promote (until-clean)) 8 + (modes js) 9 + (libraries worker)) 10 + 11 + ; (install 12 + ; (files merlin_worker.bc.js) 13 + ; (section share) 14 + ; (package merlin-js))
src/worker/bin/merlin_worker.ml

This is a binary file and will not be displayed.

-32
src/worker/dune
··· 1 - (env 2 - (_ (js_of_ocaml (compilation_mode whole_program)))) 3 - 4 - (executable 5 - (name merlin_worker) 6 - (promote (until-clean)) 7 - (modes js) 8 - (js_of_ocaml 9 - (javascript_files stubs.js)) 10 - (libraries 11 - static_files 12 - protocol 13 - merlin-lib.kernel 14 - merlin-lib.utils 15 - merlin-lib.query_protocol 16 - merlin-lib.query_commands 17 - merlin-lib.ocaml_parsing 18 - 19 - brr 20 - js_of_ocaml)) 21 - 22 - ; (rule 23 - ; (deps 24 - ; merlin_worker.bc.js 25 - ; client/merlin_client.bc.js 26 - ; index.jsx 27 - ; package.json 28 - ; yarn.lock 29 - ; (source_tree node_modules)) 30 - ; (targets index.js) 31 - ; (mode (promote (until-clean))) 32 - ; (action (run yarn build)))
+15
src/worker/lib/dune
··· 1 + (library 2 + (name worker) 3 + (public_name merlin-js.worker) 4 + (js_of_ocaml 5 + (javascript_files stubs.js)) 6 + (libraries 7 + static_files 8 + protocol 9 + merlin-lib.kernel 10 + merlin-lib.utils 11 + merlin-lib.query_protocol 12 + merlin-lib.query_commands 13 + merlin-lib.ocaml_parsing 14 + brr 15 + js_of_ocaml))
+201
src/worker/lib/worker.ml
··· 1 + open Merlin_utils 2 + open Brr 3 + open Std 4 + open Merlin_kernel 5 + module Location = Ocaml_parsing.Location 6 + 7 + module Make () : sig end = struct 8 + 9 + (* Load the CMIs into the pseudo file-system *) 10 + (* This add roughly 3mo to the final script. These could be loaded dynamically 11 + after the worker *) 12 + let () = List.iter ~f:(fun (path, content) -> 13 + let name = Filename.(concat "/static/stdlib" (basename path)) in 14 + Js_of_ocaml.Sys_js.create_file ~name ~content 15 + ) Static_files.stdlib_cmis 16 + 17 + let config = 18 + let initial = Mconfig.initial in 19 + { initial with 20 + merlin = { initial.merlin with 21 + stdlib = Some "/static/stdlib" }} 22 + 23 + let make_pipeline source = 24 + Mpipeline.make config source 25 + 26 + let dispatch source query = 27 + let pipeline = make_pipeline source in 28 + Mpipeline.with_pipeline pipeline @@ fun () -> ( 29 + Query_commands.dispatch pipeline query 30 + ) 31 + 32 + 33 + module Completion = struct 34 + (* Prefixing code from ocaml-lsp-server *) 35 + let rfindi = 36 + let rec loop s ~f i = 37 + if i < 0 then 38 + None 39 + else if f (String.unsafe_get s i) then 40 + Some i 41 + else 42 + loop s ~f (i - 1) 43 + in 44 + fun ?from s ~f -> 45 + let from = 46 + let len = String.length s in 47 + match from with 48 + | None -> len - 1 49 + | Some i -> 50 + if i > len - 1 then 51 + raise @@ Invalid_argument "rfindi: invalid from" 52 + else 53 + i 54 + in 55 + loop s ~f from 56 + let lsplit2 s ~on = 57 + match String.index_opt s on with 58 + | None -> None 59 + | Some i -> 60 + let open String in 61 + Some (sub s ~pos:0 ~len:i, sub s ~pos:(i + 1) ~len:(length s - i - 1)) 62 + 63 + (** @see <https://ocaml.org/manual/lex.html> reference *) 64 + let prefix_of_position ?(short_path = false) source position = 65 + match Msource.text source with 66 + | "" -> "" 67 + | text -> 68 + let from = 69 + let (`Offset index) = Msource.get_offset source position in 70 + min (String.length text - 1) (index - 1) 71 + in 72 + let pos = 73 + let should_terminate = ref false in 74 + let has_seen_dot = ref false in 75 + let is_prefix_char c = 76 + if !should_terminate then 77 + false 78 + else 79 + match c with 80 + | 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '\'' | '_' 81 + (* Infix function characters *) 82 + | '$' | '&' | '*' | '+' | '-' | '/' | '=' | '>' 83 + | '@' | '^' | '!' | '?' | '%' | '<' | ':' | '~' | '#' -> 84 + true 85 + | '`' -> 86 + if !has_seen_dot then 87 + false 88 + else ( 89 + should_terminate := true; 90 + true 91 + ) | '.' -> 92 + has_seen_dot := true; 93 + not short_path 94 + | _ -> false 95 + in 96 + rfindi text ~from ~f:(fun c -> not (is_prefix_char c)) 97 + in 98 + let pos = 99 + match pos with 100 + | None -> 0 101 + | Some pos -> pos + 1 102 + in 103 + let len = from - pos + 1 in 104 + let reconstructed_prefix = String.sub text ~pos ~len in 105 + (* if we reconstructed [~f:ignore] or [?f:ignore], we should take only 106 + [ignore], so: *) 107 + if 108 + String.is_prefixed ~by:"~" reconstructed_prefix 109 + || String.is_prefixed ~by:"?" reconstructed_prefix 110 + then 111 + match lsplit2 reconstructed_prefix ~on:':' with 112 + | Some (_, s) -> s 113 + | None -> reconstructed_prefix 114 + else 115 + reconstructed_prefix 116 + 117 + 118 + let at_pos source position = 119 + let prefix = prefix_of_position source position in 120 + let `Offset to_ = Msource.get_offset source position in 121 + let from = 122 + to_ - String.length (prefix_of_position ~short_path:true source position) 123 + in 124 + 125 + Console.(log ["Prefix:";prefix]); 126 + if prefix = "" then 127 + None 128 + else 129 + let query = Query_protocol.Complete_prefix (prefix, position, [], true, true) 130 + in 131 + Some (from, to_, dispatch source query) 132 + end 133 + (* 134 + let dump () = 135 + let query = Query_protocol.Dump [`String "paths"] in 136 + dispatch (Msource.make "") query *) 137 + 138 + (* let dump_config () = 139 + let pipeline = make_pipeline (Msource.make "") in 140 + Mpipeline.with_pipeline pipeline @@ fun () -> 141 + Mconfig.dump (Mpipeline.final_config pipeline) 142 + |> Json.pretty_to_string *) 143 + 144 + let on_message e = 145 + let marshaled_message = Brr_io.Message.Ev.data e in 146 + let action : Protocol.action = 147 + Marshal.from_bytes marshaled_message 0 148 + in 149 + Console.(log ["w: Received message:"; action]); 150 + let res = 151 + match action with 152 + | Complete_prefix (source, position) -> 153 + let source = Msource.make source in 154 + begin match Completion.at_pos source position with 155 + | Some (from, to_, compl) -> 156 + let entries = compl.entries in 157 + Protocol.Completions { from; to_; entries; } 158 + | None -> 159 + Protocol.Completions { from = 0; to_ = 0; entries = []; } 160 + end 161 + | Type_enclosing (source, position) -> 162 + let source = Msource.make source in 163 + let query = Query_protocol.Type_enclosing (None, position, None) in 164 + Protocol.Typed_enclosings (dispatch source query) 165 + | Protocol.All_errors source -> 166 + Console.(log ["w: Query errors"]); 167 + let source = Msource.make source in 168 + let query = Query_protocol.Errors { 169 + lexing = true; 170 + parsing = true; 171 + typing = true; 172 + } 173 + in 174 + let errors = 175 + dispatch source query 176 + |> List.map ~f:(fun (Location.{kind; main=_ ; sub; source} as error) -> 177 + let of_sub sub = 178 + Location.print_sub_msg Format.str_formatter sub; 179 + String.trim (Format.flush_str_formatter ()) 180 + in 181 + let loc = Location.loc_of_report error in 182 + let main = 183 + Format.asprintf "@[%a@]" Location.print_main error |> String.trim 184 + in 185 + Protocol.{ 186 + kind; 187 + loc; 188 + main; 189 + sub = List.map ~f:of_sub sub; 190 + source; 191 + }) 192 + in 193 + Protocol.Errors errors 194 + in 195 + let res = Marshal.to_bytes res [] in 196 + Brr_webworkers.Worker.G.post res 197 + 198 + let () = Jv.(set global "onmessage" @@ Jv.repr on_message) 199 + 200 + (* let () = Console.(log [dump (); dump_config ()]) *) 201 + end
+1
src/worker/static/dune src/worker/lib/static/dune
··· 2 2 3 3 (library 4 4 (name static_files) 5 + (public_name merlin-js.worker.static) 5 6 (modules static_files) 6 7 (preprocess (pps ppx_blob)) 7 8 (preprocessor_deps
src/worker/static/gen_static.ml src/worker/lib/static/gen_static.ml
src/worker/static/stdlib/bigarray.cmi src/worker/lib/static/stdlib/bigarray.cmi
src/worker/static/stdlib/camlinternalAtomic.cmi src/worker/lib/static/stdlib/camlinternalAtomic.cmi
src/worker/static/stdlib/camlinternalFormat.cmi src/worker/lib/static/stdlib/camlinternalFormat.cmi
src/worker/static/stdlib/camlinternalFormatBasics.cmi src/worker/lib/static/stdlib/camlinternalFormatBasics.cmi
src/worker/static/stdlib/camlinternalLazy.cmi src/worker/lib/static/stdlib/camlinternalLazy.cmi
src/worker/static/stdlib/camlinternalMod.cmi src/worker/lib/static/stdlib/camlinternalMod.cmi
src/worker/static/stdlib/camlinternalOO.cmi src/worker/lib/static/stdlib/camlinternalOO.cmi
src/worker/static/stdlib/dynlink.cmi src/worker/lib/static/stdlib/dynlink.cmi
src/worker/static/stdlib/profiling.cmi src/worker/lib/static/stdlib/profiling.cmi
src/worker/static/stdlib/std_exit.cmi src/worker/lib/static/stdlib/std_exit.cmi
src/worker/static/stdlib/stdlib.cmi src/worker/lib/static/stdlib/stdlib.cmi
src/worker/static/stdlib/stdlib__Arg.cmi src/worker/lib/static/stdlib/stdlib__Arg.cmi
src/worker/static/stdlib/stdlib__Array.cmi src/worker/lib/static/stdlib/stdlib__Array.cmi
src/worker/static/stdlib/stdlib__ArrayLabels.cmi src/worker/lib/static/stdlib/stdlib__ArrayLabels.cmi
src/worker/static/stdlib/stdlib__Atomic.cmi src/worker/lib/static/stdlib/stdlib__Atomic.cmi
src/worker/static/stdlib/stdlib__Bigarray.cmi src/worker/lib/static/stdlib/stdlib__Bigarray.cmi
src/worker/static/stdlib/stdlib__Bool.cmi src/worker/lib/static/stdlib/stdlib__Bool.cmi
src/worker/static/stdlib/stdlib__Buffer.cmi src/worker/lib/static/stdlib/stdlib__Buffer.cmi
src/worker/static/stdlib/stdlib__Bytes.cmi src/worker/lib/static/stdlib/stdlib__Bytes.cmi
src/worker/static/stdlib/stdlib__BytesLabels.cmi src/worker/lib/static/stdlib/stdlib__BytesLabels.cmi
src/worker/static/stdlib/stdlib__Callback.cmi src/worker/lib/static/stdlib/stdlib__Callback.cmi
src/worker/static/stdlib/stdlib__Char.cmi src/worker/lib/static/stdlib/stdlib__Char.cmi
src/worker/static/stdlib/stdlib__Complex.cmi src/worker/lib/static/stdlib/stdlib__Complex.cmi
src/worker/static/stdlib/stdlib__Digest.cmi src/worker/lib/static/stdlib/stdlib__Digest.cmi
src/worker/static/stdlib/stdlib__Either.cmi src/worker/lib/static/stdlib/stdlib__Either.cmi
src/worker/static/stdlib/stdlib__Ephemeron.cmi src/worker/lib/static/stdlib/stdlib__Ephemeron.cmi
src/worker/static/stdlib/stdlib__Filename.cmi src/worker/lib/static/stdlib/stdlib__Filename.cmi
src/worker/static/stdlib/stdlib__Float.cmi src/worker/lib/static/stdlib/stdlib__Float.cmi
src/worker/static/stdlib/stdlib__Format.cmi src/worker/lib/static/stdlib/stdlib__Format.cmi
src/worker/static/stdlib/stdlib__Fun.cmi src/worker/lib/static/stdlib/stdlib__Fun.cmi
src/worker/static/stdlib/stdlib__Gc.cmi src/worker/lib/static/stdlib/stdlib__Gc.cmi
src/worker/static/stdlib/stdlib__Genlex.cmi src/worker/lib/static/stdlib/stdlib__Genlex.cmi
src/worker/static/stdlib/stdlib__Hashtbl.cmi src/worker/lib/static/stdlib/stdlib__Hashtbl.cmi
src/worker/static/stdlib/stdlib__In_channel.cmi src/worker/lib/static/stdlib/stdlib__In_channel.cmi
src/worker/static/stdlib/stdlib__Int.cmi src/worker/lib/static/stdlib/stdlib__Int.cmi
src/worker/static/stdlib/stdlib__Int32.cmi src/worker/lib/static/stdlib/stdlib__Int32.cmi
src/worker/static/stdlib/stdlib__Int64.cmi src/worker/lib/static/stdlib/stdlib__Int64.cmi
src/worker/static/stdlib/stdlib__Lazy.cmi src/worker/lib/static/stdlib/stdlib__Lazy.cmi
src/worker/static/stdlib/stdlib__Lexing.cmi src/worker/lib/static/stdlib/stdlib__Lexing.cmi
src/worker/static/stdlib/stdlib__List.cmi src/worker/lib/static/stdlib/stdlib__List.cmi
src/worker/static/stdlib/stdlib__ListLabels.cmi src/worker/lib/static/stdlib/stdlib__ListLabels.cmi
src/worker/static/stdlib/stdlib__Map.cmi src/worker/lib/static/stdlib/stdlib__Map.cmi
src/worker/static/stdlib/stdlib__Marshal.cmi src/worker/lib/static/stdlib/stdlib__Marshal.cmi
src/worker/static/stdlib/stdlib__MoreLabels.cmi src/worker/lib/static/stdlib/stdlib__MoreLabels.cmi
src/worker/static/stdlib/stdlib__Nativeint.cmi src/worker/lib/static/stdlib/stdlib__Nativeint.cmi
src/worker/static/stdlib/stdlib__Obj.cmi src/worker/lib/static/stdlib/stdlib__Obj.cmi
src/worker/static/stdlib/stdlib__Oo.cmi src/worker/lib/static/stdlib/stdlib__Oo.cmi
src/worker/static/stdlib/stdlib__Option.cmi src/worker/lib/static/stdlib/stdlib__Option.cmi
src/worker/static/stdlib/stdlib__Out_channel.cmi src/worker/lib/static/stdlib/stdlib__Out_channel.cmi
src/worker/static/stdlib/stdlib__Parsing.cmi src/worker/lib/static/stdlib/stdlib__Parsing.cmi
src/worker/static/stdlib/stdlib__Pervasives.cmi src/worker/lib/static/stdlib/stdlib__Pervasives.cmi
src/worker/static/stdlib/stdlib__Printexc.cmi src/worker/lib/static/stdlib/stdlib__Printexc.cmi
src/worker/static/stdlib/stdlib__Printf.cmi src/worker/lib/static/stdlib/stdlib__Printf.cmi
src/worker/static/stdlib/stdlib__Queue.cmi src/worker/lib/static/stdlib/stdlib__Queue.cmi
src/worker/static/stdlib/stdlib__Random.cmi src/worker/lib/static/stdlib/stdlib__Random.cmi
src/worker/static/stdlib/stdlib__Result.cmi src/worker/lib/static/stdlib/stdlib__Result.cmi
src/worker/static/stdlib/stdlib__Scanf.cmi src/worker/lib/static/stdlib/stdlib__Scanf.cmi
src/worker/static/stdlib/stdlib__Seq.cmi src/worker/lib/static/stdlib/stdlib__Seq.cmi
src/worker/static/stdlib/stdlib__Set.cmi src/worker/lib/static/stdlib/stdlib__Set.cmi
src/worker/static/stdlib/stdlib__Stack.cmi src/worker/lib/static/stdlib/stdlib__Stack.cmi
src/worker/static/stdlib/stdlib__StdLabels.cmi src/worker/lib/static/stdlib/stdlib__StdLabels.cmi
src/worker/static/stdlib/stdlib__Stream.cmi src/worker/lib/static/stdlib/stdlib__Stream.cmi
src/worker/static/stdlib/stdlib__String.cmi src/worker/lib/static/stdlib/stdlib__String.cmi
src/worker/static/stdlib/stdlib__StringLabels.cmi src/worker/lib/static/stdlib/stdlib__StringLabels.cmi
src/worker/static/stdlib/stdlib__Sys.cmi src/worker/lib/static/stdlib/stdlib__Sys.cmi
src/worker/static/stdlib/stdlib__Uchar.cmi src/worker/lib/static/stdlib/stdlib__Uchar.cmi
src/worker/static/stdlib/stdlib__Unit.cmi src/worker/lib/static/stdlib/stdlib__Unit.cmi
src/worker/static/stdlib/stdlib__Weak.cmi src/worker/lib/static/stdlib/stdlib__Weak.cmi
src/worker/static/stdlib/str.cmi src/worker/lib/static/stdlib/str.cmi
src/worker/static/stdlib/topdirs.cmi src/worker/lib/static/stdlib/topdirs.cmi
src/worker/static/stdlib/unix.cmi src/worker/lib/static/stdlib/unix.cmi
src/worker/static/stdlib/unixLabels.cmi src/worker/lib/static/stdlib/unixLabels.cmi
src/worker/stubs.js src/worker/lib/stubs.js