@@ -3,81 +3,95 @@ open Brr
33
44module Utils = Utils
55
6- let linter worker = fun view ->
7- let open Fut.Syntax in
8- let doc = Utils. get_full_doc @@ Editor.View. state view in
9- let + result = Merlin_client. query_errors worker doc in
10- List. map (fun Protocol. { kind; loc; main; sub = _ ; source } ->
11- let from = loc.loc_start.pos_cnum in
12- let to_ = loc.loc_end.pos_cnum in
13- let source = Protocol. report_source_to_string source in
14- let severity = match kind with
15- | Report_error
16- | Report_warning_as_error _
17- | Report_alert_as_error _ -> Lint.Diagnostic. Error
18- | Report_warning _ -> Lint.Diagnostic. Warning
19- | Report_alert _ -> Lint.Diagnostic. Info
20- in
21- Lint.Diagnostic. create ~source ~from ~to_ ~severity ~message: main ()
22- ) result
23- |> Array. of_list
24-
25- let keywords = List. map
26- (fun label ->
27- Autocomplete.Completion. create ~label ~type_: " keyword" () )
28- [
29- " as" ; " do" ; " else" ; " end" ; " exception" ; " fun" ; " functor" ; " if" ; " in" ;
30- " include" ; " let" ; " of" ; " open" ; " rec" ; " struct" ; " then" ; " type" ; " val" ;
31- " while" ; " with" ; " and" ; " assert" ; " begin" ; " class" ; " constraint" ;
32- " done" ; " downto" ; " external" ; " function" ; " initializer" ; " lazy" ;
33- " match" ; " method" ; " module" ; " mutable" ; " new" ; " nonrec" ; " object" ;
34- " private" ; " sig" ; " to" ; " try" ; " value" ; " virtual" ; " when" ;
35- ]
6+ let ocaml = Jv. get Jv. global " __CM__mllike" |> Stream.Language. of_jv
7+ let ocaml = Stream.Language. define ocaml
368
37- let merlin_completion worker = fun ctx ->
38- let open Fut.Syntax in
39- let source = Utils. get_full_doc @@ Autocomplete.Context. state ctx in
40- let pos = Autocomplete.Context. pos ctx in
41- let + { from; to_; entries } =
42- Merlin_client. query_completions worker source (`Offset pos)
43- in
44- let options =
45- let num_completions = List. length entries in
46- List. mapi (fun i Query_protocol.Compl. { name; desc; _ } ->
47- let boost = num_completions - i in
48- Autocomplete.Completion. create ~label: name ~detail: desc ~boost () ) entries
49- in
50- Some (Autocomplete.Result. create ~filter: true ~from ~to_ ~options () )
9+ module Extensions (Worker : Merlin_client.WORKER ) = struct
5110
52- let autocomplete worker =
53- let override = [
54- Autocomplete.Source. from_list keywords;
55- Autocomplete.Source. create @@ merlin_completion worker]
56- in
57- let config = Autocomplete. config () ~override in
58- Autocomplete. create ~config ()
11+ module Merlin_client = Merlin_client. Make (Worker )
12+ type worker = Merlin_client .worker
5913
60- let tooltip_on_hover worker =
61- let open Tooltip in
62- hover_tooltip @@
63- fun ~view ~pos ~side :_ ->
14+ let linter worker = fun view ->
6415 let open Fut.Syntax in
6516 let doc = Utils. get_full_doc @@ Editor.View. state view in
66- let pos = `Offset pos in
67- let + result = Merlin_client. query_type worker doc pos in
68- match result with
69- | (loc , `String type_ , _ )::_ ->
70- let create _view =
71- let dom = El. div [El. txt' type_] in
72- Tooltip_view. create ~dom ()
17+ let + result = Merlin_client. query_errors worker doc in
18+ List. map (fun Protocol. { kind; loc; main; sub = _ ; source } ->
19+ let from = loc.loc_start.pos_cnum in
20+ let to_ = loc.loc_end.pos_cnum in
21+ let source = Protocol. report_source_to_string source in
22+ let severity = match kind with
23+ | Report_error
24+ | Report_warning_as_error _
25+ | Report_alert_as_error _ -> Lint.Diagnostic. Error
26+ | Report_warning _ -> Lint.Diagnostic. Warning
27+ | Report_alert _ -> Lint.Diagnostic. Info
7328 in
74- let pos = loc.loc_start.pos_cnum in
75- let end_ = loc.loc_end.pos_cnum in
76- Some (Tooltip. create ~pos ~end_ ~above: true ~arrow: true ~create () )
77- | _ -> None
29+ Lint.Diagnostic. create ~source ~from ~to_ ~severity ~message: main ()
30+ ) result
31+ |> Array. of_list
7832
79- let ocaml = Jv. get Jv. global " __CM__mllike" |> Stream.Language. of_jv
80- let ocaml = Stream.Language. define ocaml
33+ let keywords = List. map
34+ (fun label ->
35+ Autocomplete.Completion. create ~label ~type_: " keyword" () )
36+ [
37+ " as" ; " do" ; " else" ; " end" ; " exception" ; " fun" ; " functor" ; " if" ; " in" ;
38+ " include" ; " let" ; " of" ; " open" ; " rec" ; " struct" ; " then" ; " type" ; " val" ;
39+ " while" ; " with" ; " and" ; " assert" ; " begin" ; " class" ; " constraint" ;
40+ " done" ; " downto" ; " external" ; " function" ; " initializer" ; " lazy" ;
41+ " match" ; " method" ; " module" ; " mutable" ; " new" ; " nonrec" ; " object" ;
42+ " private" ; " sig" ; " to" ; " try" ; " value" ; " virtual" ; " when" ;
43+ ]
44+
45+ let merlin_completion worker = fun ctx ->
46+ let open Fut.Syntax in
47+ let source = Utils. get_full_doc @@ Autocomplete.Context. state ctx in
48+ let pos = Autocomplete.Context. pos ctx in
49+ let + { from; to_; entries } =
50+ Merlin_client. query_completions worker source (`Offset pos)
51+ in
52+ let options =
53+ let num_completions = List. length entries in
54+ List. mapi (fun i Query_protocol.Compl. { name; desc; _ } ->
55+ let boost = num_completions - i in
56+ Autocomplete.Completion. create ~label: name ~detail: desc ~boost () ) entries
57+ in
58+ Some (Autocomplete.Result. create ~filter: true ~from ~to_ ~options () )
59+
60+ let autocomplete worker =
61+ let override = [
62+ Autocomplete.Source. from_list keywords;
63+ Autocomplete.Source. create @@ merlin_completion worker]
64+ in
65+ let config = Autocomplete. config () ~override in
66+ Autocomplete. create ~config ()
67+
68+ let tooltip_on_hover worker =
69+ let open Tooltip in
70+ hover_tooltip @@
71+ fun ~view ~pos ~side :_ ->
72+ let open Fut.Syntax in
73+ let doc = Utils. get_full_doc @@ Editor.View. state view in
74+ let pos = `Offset pos in
75+ let + result = Merlin_client. query_type worker doc pos in
76+ match result with
77+ | (loc , `String type_ , _ )::_ ->
78+ let create _view =
79+ let dom = El. div [El. txt' type_] in
80+ Tooltip_view. create ~dom ()
81+ in
82+ let pos = loc.loc_start.pos_cnum in
83+ let end_ = loc.loc_end.pos_cnum in
84+ Some (Tooltip. create ~pos ~end_ ~above: true ~arrow: true ~create () )
85+ | _ -> None
86+
87+ let linter worker = Lint. create (linter worker)
88+
89+ let all_extensions worker = [|
90+ linter worker;
91+ autocomplete worker;
92+ tooltip_on_hover worker
93+ |]
94+ end
8195
8296module type Config = sig
8397 val worker_url : string
@@ -90,13 +104,10 @@ module Make (Config : Config) = struct
90104 let _ = Merlin_client. add_cmis worker Config. cmis in
91105 worker
92106
107+ open Extensions (Merlin_client. Webworker )
108+
93109 let autocomplete = autocomplete worker
94110 let tooltip_on_hover = tooltip_on_hover worker
95- let linter = Lint. create (linter worker)
96-
97- let all_extensions = [|
98- linter;
99- autocomplete;
100- tooltip_on_hover
101- |]
111+ let linter = linter worker
112+ let all_extensions = all_extensions worker
102113end
0 commit comments