@@ -10,10 +10,24 @@ open Lwt.Infix
1010
1111type slot = { local : string option ; name : string }
1212type active = { rank : int ; cursor_pos : Loc .position ; out_of_sync : bool }
13- type model = { current : active option ; directory : slot Mods.IntMap .t }
13+
14+ type model = {
15+ current : active option ;
16+ directory : slot Mods.IntMap .t ;
17+ incremental : bool ;
18+ }
1419
1520let dummy_cursor_pos = { Loc. line = - 1 ; Loc. chr = 0 }
16- let blank_state = { current = None ; directory = Mods.IntMap. empty }
21+
22+ let blank_state =
23+ {
24+ current = None ;
25+ directory = Mods.IntMap. empty;
26+ incremental =
27+ (React.S. value State_project. model).State_project. model_parameters
28+ .State_project. enable_incremental_analysis;
29+ }
30+
1731let model_hooked, set_directory_state = Hooked.S. create blank_state
1832let model = Hooked.S. to_react_signal model_hooked
1933
@@ -33,13 +47,27 @@ let current_filename =
3347 m.current)
3448 model
3549
36- let is_incremental () =
37- (React.S. value State_project. model).State_project. model_parameters
38- .State_project. enable_incremental_analysis
50+ let is_incremental () = (React.S. value model).incremental
51+
52+ let toggle_incremental_analysis enable_incremental_analysis =
53+ let state = React.S. value model in
54+ if state.incremental <> enable_incremental_analysis then (
55+ let () =
56+ set_directory_state
57+ { state with incremental = enable_incremental_analysis }
58+ in
59+ State_project. eval_with_project ~label: __LOC__
60+ (fun (manager : Api.concrete_manager ) ->
61+ if enable_incremental_analysis then
62+ manager#file_update_ws (React.S. value current_filename)
63+ else
64+ manager#file_update_ws None )
65+ ) else
66+ Lwt. return (Result_util. ok () )
3967
4068let update_ws_if_incremental manager filename _ =
4169 if is_incremental () then
42- manager#file_update_ws filename
70+ manager#file_update_ws ( Some filename)
4371 else
4472 Lwt. return (Result_util. ok () )
4573
@@ -116,7 +144,7 @@ let update_directory ~reset current catalog =
116144 state.directory)
117145 catalog
118146 in
119- set_directory_state { current; directory }
147+ set_directory_state { state with current; directory }
120148
121149let create_file ~(filename : string ) ~(content : string ) : unit Api.lwt_result =
122150 State_project. eval_with_project ~label: " create_file" (fun manager ->
@@ -200,12 +228,13 @@ let set_content (content : string) : unit Api.lwt_result =
200228 { local = Some content; name }
201229 state.directory
202230 in
203- let () = set_directory_state { current = state.current; directory } in
231+ let () = set_directory_state { state with directory } in
204232 Lwt. return (Result_util. ok () )
205233 | { local = None ; name } ->
206234 let () =
207235 set_directory_state
208236 {
237+ state with
209238 current =
210239 Some
211240 {
@@ -232,7 +261,7 @@ let set_compile file_id (compile : bool) : unit Api.lwt_result =
232261 let directory =
233262 Mods.IntMap. add rank { local = None ; name } state.directory
234263 in
235- let () = set_directory_state { current = state.current; directory } in
264+ let () = set_directory_state { state with directory } in
236265 State_project. eval_with_project ~label: " set_compile" (fun manager ->
237266 manager#file_create rank name content)
238267 ) else
@@ -250,9 +279,7 @@ let set_compile file_id (compile : bool) : unit Api.lwt_result =
250279 { local = Some content; name }
251280 state.directory
252281 in
253- let () =
254- set_directory_state { current = state.current; directory }
255- in
282+ let () = set_directory_state { state with directory } in
256283 State_project. eval_with_project ~label: " set_compile'"
257284 (fun manager -> manager#file_delete name)
258285 ) else (
@@ -271,7 +298,7 @@ let remove_file () : unit Api.lwt_result =
271298 { rank; cursor_pos = dummy_cursor_pos; out_of_sync = false })
272299 (Mods.IntMap. root directory)
273300 in
274- let () = set_directory_state { current; directory } in
301+ let () = set_directory_state { state with current; directory } in
275302 let x = send_refresh None in
276303 match local with
277304 | Some _ -> x
@@ -305,9 +332,9 @@ let do_a_move state file_id rank =
305332 State_project. eval_with_project ~label: " remove_file" (fun manager ->
306333 manager#file_move rank file_id
307334 >> = Api_common. result_bind_with_lwt ~ok: (fun () ->
308- Lwt. return (Result_util. ok { current; directory })))
335+ Lwt. return (Result_util. ok { state with current; directory })))
309336 else
310- Lwt. return (Result_util. ok { current; directory })
337+ Lwt. return (Result_util. ok { state with current; directory })
311338
312339let rec set_position state file_id rank =
313340 match Mods.IntMap. find_option rank state.directory with
@@ -340,14 +367,14 @@ let cursor_activity ~line ~ch =
340367 | Some { rank; out_of_sync; _ } ->
341368 set_directory_state
342369 {
370+ v with
343371 current =
344372 Some
345373 {
346374 rank;
347375 cursor_pos = { Loc. line = succ line; chr = ch };
348376 out_of_sync;
349377 };
350- directory = v.directory;
351378 }
352379
353380let out_of_sync out_of_sync =
@@ -356,10 +383,7 @@ let out_of_sync out_of_sync =
356383 | None -> ()
357384 | Some { rank; cursor_pos; _ } ->
358385 set_directory_state
359- {
360- current = Some { rank; cursor_pos; out_of_sync };
361- directory = v.directory;
362- }
386+ { v with current = Some { rank; cursor_pos; out_of_sync } }
363387
364388let sync ?(reset = false ) () : unit Api.lwt_result =
365389 State_project. eval_with_project ~label: " select_file" (fun manager ->
0 commit comments