···763763764764 let failed_cells = ref StringSet.empty
765765766766- let complete_prefix _id _deps is_toplevel source position =
766766+ let complete_prefix id deps is_toplevel source position =
767767 try
768768- let line1, src = mangle_toplevel is_toplevel source [] in
769769- let src = line1 ^ src in
770770- Logs.info (fun m -> m "line1: '%s' (length: %d)" line1 (String.length line1));
768768+ Logs.info (fun m -> m "completing for id: %s" (match id with Some x -> x | None -> "(none)"));
771769770770+ let line1, src = mangle_toplevel is_toplevel source deps in
771771+ Logs.info (fun m -> m "line1: '%s' (length: %d)" line1 (String.length line1));
772772+ Logs.info (fun m -> m "src: '%s' (length: %d)" src (String.length src));
773773+ let src = line1 ^ src in
772774 let source = Merlin_kernel.Msource.make src in
773775 let map_kind :
774776 [ `Value
···798800 | Logical (x, y) -> `Logical (x + 1, y)
799801 | End -> `End
800802 in
803803+804804+ (match position with
805805+ | `Offset x ->
806806+ let first_char = String.sub src (x-1) 1 in
807807+ Logs.info (fun m -> m "complete after offset: %s" first_char)
808808+ | _ -> ());
809809+801810 match Completion.at_pos source position with
802811 | Some (from, to_, compl) ->
803812 let entries =
+110-6
test/node/node_test.expected
···4646node_test.js: [INFO] file_exists: /static/cmis/cell__c2.cmi = true
4747node_test.js: [INFO] Number of errors1: 1 (should be 1)
4848node_test.js: [INFO] Number of errors2: 0 (should be 0)
4949-node_test.js: [ERROR] xx Warning, ignoring toplevel block without a leading '# '.
5050-4949+node_test.js: [INFO] completing for id: c_comp1
5150node_test.js: [INFO] line1: '' (length: 0)
5151+node_test.js: [INFO] src: 'let _ = List.leng' (length: 17)
5252+node_test.js: [INFO] complete after offset: g
5253node_test.js: [INFO] Fetching stdlib__List.cmi
53545455node_test.js: [INFO] sync_get: _opam/lib/ocaml/stdlib__List.cmi
5556node_test.js: [INFO] Completions for 'List.leng': 1 entries
5657node_test.js: [INFO] - length (Value): 'a list -> int
5858+node_test.js: [INFO] completing for id: c_comp2
5759node_test.js: [INFO] line1: '' (length: 0)
5858-node_test.js: [INFO] Completions for 'List.': 2 entries
5959-node_test.js: [INFO] - List (Module):
6060-node_test.js: [INFO] - ListLabels (Module):
6060+node_test.js: [INFO] src: ' let _ = List.' (length: 15)
6161+node_test.js: [INFO] complete after offset: .
6262+node_test.js: [INFO] Completions for 'List.': 68 entries
6363+node_test.js: [INFO] - (::) (Constructor): 'a * 'a list -> 'a List.t
6464+node_test.js: [INFO] - ([]) (Constructor): 'a List.t
6565+node_test.js: [INFO] - append (Value): 'a list -> 'a list -> 'a list
6666+node_test.js: [INFO] - assoc (Value): 'a -> ('a * 'b) list -> 'b
6767+node_test.js: [INFO] - assoc_opt (Value): 'a -> ('a * 'b) list -> 'b option
6868+node_test.js: [INFO] - assq (Value): 'a -> ('a * 'b) list -> 'b
6969+node_test.js: [INFO] - assq_opt (Value): 'a -> ('a * 'b) list -> 'b option
7070+node_test.js: [INFO] - combine (Value): 'a list -> 'b list -> ('a * 'b) list
7171+node_test.js: [INFO] - compare (Value): ('a -> 'a -> int) -> 'a list -> 'a list -> int
7272+node_test.js: [INFO] - compare_length_with (Value): 'a list -> int -> int
7373+node_test.js: [INFO] - compare_lengths (Value): 'a list -> 'b list -> int
7474+node_test.js: [INFO] - concat (Value): 'a list list -> 'a list
7575+node_test.js: [INFO] - concat_map (Value): ('a -> 'b list) -> 'a list -> 'b list
7676+node_test.js: [INFO] - cons (Value): 'a -> 'a list -> 'a list
7777+node_test.js: [INFO] - equal (Value): ('a -> 'a -> bool) -> 'a list -> 'a list -> bool
7878+node_test.js: [INFO] - exists (Value): ('a -> bool) -> 'a list -> bool
7979+node_test.js: [INFO] - exists2 (Value): ('a -> 'b -> bool) -> 'a list -> 'b list -> bool
8080+node_test.js: [INFO] - fast_sort (Value): ('a -> 'a -> int) -> 'a list -> 'a list
8181+node_test.js: [INFO] - filter (Value): ('a -> bool) -> 'a list -> 'a list
8282+node_test.js: [INFO] - filter_map (Value): ('a -> 'b option) -> 'a list -> 'b list
8383+node_test.js: [INFO] - filteri (Value): (int -> 'a -> bool) -> 'a list -> 'a list
8484+node_test.js: [INFO] - find (Value): ('a -> bool) -> 'a list -> 'a
8585+node_test.js: [INFO] - find_all (Value): ('a -> bool) -> 'a list -> 'a list
8686+node_test.js: [INFO] - find_index (Value): ('a -> bool) -> 'a list -> int option
8787+node_test.js: [INFO] - find_map (Value): ('a -> 'b option) -> 'a list -> 'b option
8888+node_test.js: [INFO] - find_mapi (Value): (int -> 'a -> 'b option) -> 'a list -> 'b option
8989+node_test.js: [INFO] - find_opt (Value): ('a -> bool) -> 'a list -> 'a option
9090+node_test.js: [INFO] - flatten (Value): 'a list list -> 'a list
9191+node_test.js: [INFO] - fold_left (Value): ('acc -> 'a -> 'acc) -> 'acc -> 'a list -> 'acc
9292+node_test.js: [INFO] - fold_left2 (Value): ('acc -> 'a -> 'b -> 'acc) -> 'acc -> 'a list -> 'b list -> 'acc
9393+node_test.js: [INFO] - fold_left_map (Value): ('acc -> 'a -> 'acc * 'b) -> 'acc -> 'a list -> 'acc * 'b list
9494+node_test.js: [INFO] - fold_right (Value): ('a -> 'acc -> 'acc) -> 'a list -> 'acc -> 'acc
9595+node_test.js: [INFO] - fold_right2 (Value): ('a -> 'b -> 'acc -> 'acc) -> 'a list -> 'b list -> 'acc -> 'acc
9696+node_test.js: [INFO] - for_all (Value): ('a -> bool) -> 'a list -> bool
9797+node_test.js: [INFO] - for_all2 (Value): ('a -> 'b -> bool) -> 'a list -> 'b list -> bool
9898+node_test.js: [INFO] - hd (Value): 'a list -> 'a
9999+node_test.js: [INFO] - init (Value): int -> (int -> 'a) -> 'a list
100100+node_test.js: [INFO] - is_empty (Value): 'a list -> bool
101101+node_test.js: [INFO] - iter (Value): ('a -> unit) -> 'a list -> unit
102102+node_test.js: [INFO] - iter2 (Value): ('a -> 'b -> unit) -> 'a list -> 'b list -> unit
103103+node_test.js: [INFO] - iteri (Value): (int -> 'a -> unit) -> 'a list -> unit
104104+node_test.js: [INFO] - length (Value): 'a list -> int
105105+node_test.js: [INFO] - map (Value): ('a -> 'b) -> 'a list -> 'b list
106106+node_test.js: [INFO] - map2 (Value): ('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list
107107+node_test.js: [INFO] - mapi (Value): (int -> 'a -> 'b) -> 'a list -> 'b list
108108+node_test.js: [INFO] - mem (Value): 'a -> 'a list -> bool
109109+node_test.js: [INFO] - mem_assoc (Value): 'a -> ('a * 'b) list -> bool
110110+node_test.js: [INFO] - mem_assq (Value): 'a -> ('a * 'b) list -> bool
111111+node_test.js: [INFO] - memq (Value): 'a -> 'a list -> bool
112112+node_test.js: [INFO] - merge (Value): ('a -> 'a -> int) -> 'a list -> 'a list -> 'a list
113113+node_test.js: [INFO] - nth (Value): 'a list -> int -> 'a
114114+node_test.js: [INFO] - nth_opt (Value): 'a list -> int -> 'a option
115115+node_test.js: [INFO] - of_seq (Value): 'a Seq.t -> 'a list
116116+node_test.js: [INFO] - partition (Value): ('a -> bool) -> 'a list -> 'a list * 'a list
117117+node_test.js: [INFO] - partition_map (Value): ('a -> ('b, 'c) Either.t) -> 'a list -> 'b list * 'c list
118118+node_test.js: [INFO] - remove_assoc (Value): 'a -> ('a * 'b) list -> ('a * 'b) list
119119+node_test.js: [INFO] - remove_assq (Value): 'a -> ('a * 'b) list -> ('a * 'b) list
120120+node_test.js: [INFO] - rev (Value): 'a list -> 'a list
121121+node_test.js: [INFO] - rev_append (Value): 'a list -> 'a list -> 'a list
122122+node_test.js: [INFO] - rev_map (Value): ('a -> 'b) -> 'a list -> 'b list
123123+node_test.js: [INFO] - rev_map2 (Value): ('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list
124124+node_test.js: [INFO] - sort (Value): ('a -> 'a -> int) -> 'a list -> 'a list
125125+node_test.js: [INFO] - sort_uniq (Value): ('a -> 'a -> int) -> 'a list -> 'a list
126126+node_test.js: [INFO] - split (Value): ('a * 'b) list -> 'a list * 'b list
127127+node_test.js: [INFO] - stable_sort (Value): ('a -> 'a -> int) -> 'a list -> 'a list
128128+node_test.js: [INFO] - tl (Value): 'a list -> 'a list
129129+node_test.js: [INFO] - to_seq (Value): 'a list -> 'a Seq.t
130130+node_test.js: [INFO] - t (Type): type 'a t = 'a list = [] | (::) of 'a * 'a list
131131+node_test.js: [INFO] completing for id: c_comp3
61132node_test.js: [INFO] line1: '' (length: 0)
6262-node_test.js: [INFO] Completions for 'ma': 0 entries
133133+node_test.js: [INFO] src: ' let _ = ma' (length: 12)
134134+node_test.js: [INFO] complete after offset: a
135135+node_test.js: [INFO] Completions for 'ma': 3 entries
136136+node_test.js: [INFO] - max (Value): 'a -> 'a -> 'a
137137+node_test.js: [INFO] - max_float (Value): float
138138+node_test.js: [INFO] - max_int (Value): int
139139+node_test.js: [INFO] completing for id: c_comp4
63140node_test.js: [INFO] line1: '' (length: 0)
141141+node_test.js: [INFO] src: 'let _ = List.leng' (length: 17)
142142+node_test.js: [INFO] complete after offset: g
64143node_test.js: [INFO] Completions for 'List.leng' (non-toplevel): 1 entries
65144node_test.js: [INFO] - length (Value): 'a list -> int
145145+node_test.js: [INFO] completing for id: c_comp5
66146node_test.js: [INFO] line1: '' (length: 0)
147147+node_test.js: [INFO] src: ' let _ = List.leng
148148+ let foo=1.0;;' (length: 36)
67149node_test.js: [INFO] Completions for 'List.leng' (Logical position): 0 entries
150150+node_test.js: [INFO] completing for id: c_comp6
151151+node_test.js: [INFO] line1: '' (length: 0)
152152+node_test.js: [INFO] src: ' let my_var = 42;;
153153+ let x = 1 + my_v' (length: 38)
154154+node_test.js: [INFO] complete after offset: v
155155+node_test.js: [INFO] Completions for 'my_v' (toplevel variable): 1 entries
156156+node_test.js: [INFO] - my_var (Value): int
157157+node_test.js: [INFO] completing for id: c_comp7
158158+node_test.js: [INFO] line1: '' (length: 0)
159159+node_test.js: [INFO] src: ' let rec factorial n = if n <= 1 then 1 else n * facto' (length: 55)
160160+node_test.js: [INFO] complete after offset: o
161161+node_test.js: [INFO] Completions for 'facto' (recursive function): 1 entries
162162+node_test.js: [INFO] - factorial (Value): int -> int
163163+node_test.js: [INFO] completing for id: c_comp8
164164+node_test.js: [INFO] line1: '' (length: 0)
165165+node_test.js: [INFO] src: ' String.lengt' (length: 14)
166166+node_test.js: [INFO] complete after offset: t
167167+node_test.js: [INFO] Fetching stdlib__String.cmi
168168+169169+node_test.js: [INFO] sync_get: _opam/lib/ocaml/stdlib__String.cmi
170170+node_test.js: [INFO] Completions for 'String.lengt' (module path): 1 entries
171171+node_test.js: [INFO] - length (Value): string -> int
68172node_test.js: [INFO] Success
+93-10
test/node/node_test.ml
···117117118118 (* Test completion for List.leng *)
119119 let* completions1 =
120120- Client.complete_prefix rpc (Some "c_comp1") [] true "let _ = List.leng"
121121- (Offset 16)
120120+ let text = "let _ = List.leng" in
121121+ Client.complete_prefix rpc (Some "c_comp1") [] false text
122122+ (Offset (String.length text))
122123 in
123124 Logs.info (fun m ->
124125 m "Completions for 'List.leng': %d entries"
···142143143144 (* Test completion for List. (should show all List module functions) *)
144145 let* completions2 =
145145- Client.complete_prefix rpc (Some "c_comp2") [] true "# let _ = List."
146146- (Offset 12)
146146+ let text = "# let _ = List." in
147147+ Client.complete_prefix rpc (Some "c_comp2") [] true text
148148+ (Offset (String.length text))
147149 in
148150 Logs.info (fun m ->
149151 m "Completions for 'List.': %d entries"
···167169168170 (* Test completion for partial identifier *)
169171 let* completions3 =
170170- Client.complete_prefix rpc (Some "c_comp3") [] true "# let _ = ma"
171171- (Offset 10)
172172+ let text = "# let _ = ma" in
173173+ Client.complete_prefix rpc (Some "c_comp3") [] true text
174174+ (Offset (String.length text))
172175 in
173176 Logs.info (fun m ->
174177 m "Completions for 'ma': %d entries" (List.length completions3.entries));
···191194192195 (* Test completion in non-toplevel context *)
193196 let* completions4 =
194194- Client.complete_prefix rpc (Some "c_comp4") [] false "let _ = List.leng"
195195- (Offset 16)
197197+ let text = "let _ = List.leng" in
198198+ Client.complete_prefix rpc (Some "c_comp4") [] false text
199199+ (Offset (String.length text))
196200 in
197201 Logs.info (fun m ->
198202 m "Completions for 'List.leng' (non-toplevel): %d entries"
···216220217221 (* Test completion using Logical position constructor *)
218222 let* completions5 =
219219- Client.complete_prefix rpc (Some "c_comp5") [] true
220220- "# let _ = List.leng\n let foo=1.0;;"
223223+ let text = "# let _ = List.leng\n let foo=1.0;;" in
224224+ Client.complete_prefix rpc (Some "c_comp5") [] true text
221225 (Logical (1, 16))
222226 in
223227 Logs.info (fun m ->
···239243 | Variant -> "Variant")
240244 entry.desc))
241245 completions5.entries;
246246+247247+ (* Test toplevel completion with variable binding *)
248248+ let* completions6 =
249249+ let s = "# let my_var = 42;;\n# let x = 1 + my_v" in
250250+ Client.complete_prefix rpc (Some "c_comp6") [] true
251251+ s
252252+ (Offset (String.length s))
253253+ in
254254+ Logs.info (fun m ->
255255+ m "Completions for 'my_v' (toplevel variable): %d entries"
256256+ (List.length completions6.entries));
257257+ List.iter
258258+ (fun entry ->
259259+ Logs.info (fun m ->
260260+ m " - %s (%s): %s" entry.name
261261+ (match entry.kind with
262262+ | Constructor -> "Constructor"
263263+ | Keyword -> "Keyword"
264264+ | Label -> "Label"
265265+ | MethodCall -> "MethodCall"
266266+ | Modtype -> "Modtype"
267267+ | Module -> "Module"
268268+ | Type -> "Type"
269269+ | Value -> "Value"
270270+ | Variant -> "Variant")
271271+ entry.desc))
272272+ completions6.entries;
273273+274274+ (* Test toplevel completion with function definition *)
275275+ let* completions7 =
276276+ Client.complete_prefix rpc (Some "c_comp7") [] true
277277+ "# let rec factorial n = if n <= 1 then 1 else n * facto"
278278+ (Offset 55)
279279+ in
280280+ Logs.info (fun m ->
281281+ m "Completions for 'facto' (recursive function): %d entries"
282282+ (List.length completions7.entries));
283283+ List.iter
284284+ (fun entry ->
285285+ Logs.info (fun m ->
286286+ m " - %s (%s): %s" entry.name
287287+ (match entry.kind with
288288+ | Constructor -> "Constructor"
289289+ | Keyword -> "Keyword"
290290+ | Label -> "Label"
291291+ | MethodCall -> "MethodCall"
292292+ | Modtype -> "Modtype"
293293+ | Module -> "Module"
294294+ | Type -> "Type"
295295+ | Value -> "Value"
296296+ | Variant -> "Variant")
297297+ entry.desc))
298298+ completions7.entries;
299299+300300+ (* Test toplevel completion with module paths *)
301301+ let* completions8 =
302302+ Client.complete_prefix rpc (Some "c_comp8") [] true
303303+ "# String.lengt"
304304+ (Offset 14)
305305+ in
306306+ Logs.info (fun m ->
307307+ m "Completions for 'String.lengt' (module path): %d entries"
308308+ (List.length completions8.entries));
309309+ List.iter
310310+ (fun entry ->
311311+ Logs.info (fun m ->
312312+ m " - %s (%s): %s" entry.name
313313+ (match entry.kind with
314314+ | Constructor -> "Constructor"
315315+ | Keyword -> "Keyword"
316316+ | Label -> "Label"
317317+ | MethodCall -> "MethodCall"
318318+ | Modtype -> "Modtype"
319319+ | Module -> "Module"
320320+ | Type -> "Type"
321321+ | Value -> "Value"
322322+ | Variant -> "Variant")
323323+ entry.desc))
324324+ completions8.entries;
242325243326 (* let* o3 =
244327 Client.exec_toplevel rpc