Skip to content

Commit f6cbb68

Browse files
authored
Merge pull request #691 from maximedenes/fix-invalidation-bug
Fix observe id invalidation bug
2 parents a8dec86 + baf0f6e commit f6cbb68

File tree

2 files changed

+33
-6
lines changed

2 files changed

+33
-6
lines changed

language-server/dm/documentManager.ml

+10-6
Original file line numberDiff line numberDiff line change
@@ -211,17 +211,21 @@ let interpret_in_background st =
211211
| None -> (st, [])
212212
| Some {id} -> log ("interpret_to_end id = " ^ Stateid.to_string id); interpret_to ~stateful:true ~background:true st id
213213

214+
let is_above st id1 id2 =
215+
let range1 = Document.range_of_id st id1 in
216+
let range2 = Document.range_of_id st id2 in
217+
Position.compare range1.start range2.start < 0
218+
214219
let validate_document state =
215-
let unchanged_id, invalid_ids, document = Document.validate_document state.document in
216-
let update_observe_id id =
217-
if Stateid.Set.mem id invalid_ids then unchanged_id
218-
else Some id
220+
let unchanged_id, invalid_roots, document = Document.validate_document state.document in
221+
let observe_id = match unchanged_id, state.observe_id with
222+
| None, _ | _, None -> None
223+
| Some id, Some id' -> if is_above state.document id id' then Some id else Some id'
219224
in
220-
let observe_id = Option.bind state.observe_id update_observe_id in
221225
let execution_state =
222226
List.fold_left (fun st id ->
223227
ExecutionManager.invalidate (Document.schedule state.document) id st
224-
) state.execution_state (Stateid.Set.elements invalid_ids) in
228+
) state.execution_state (Stateid.Set.elements invalid_roots) in
225229
{ state with document; execution_state; observe_id }
226230

227231
let init init_vs ~opts uri ~text =

language-server/tests/dm_tests.ml

+23
Original file line numberDiff line numberDiff line change
@@ -357,3 +357,26 @@ let%test_unit "edit.shift_error_before_sentence" =
357357
let warning = Stdlib.List.hd @@ DocumentManager.all_diagnostics st in
358358
[%test_eq: int] 41 (warning.range.start.character);
359359
[%test_eq: int] 42 (warning.range.end_.character)
360+
361+
let%test_unit "edit.edit_non_root_observe_id_top" =
362+
let st, init_events = init_test_doc ~text:"Definition x := 1. Definition y := 2." in
363+
let st, (s1, (s2, ())) = dm_parse st (P(P O)) in
364+
let st, events = DocumentManager.interpret_to_end st in
365+
let todo = Sel.Todo.(add empty init_events) in
366+
let todo = Sel.Todo.(add todo events) in
367+
let st = handle_events todo st in
368+
let st = edit_text st ~start:0 ~stop:18 ~text:"Definition x := 3." in
369+
[%test_eq: bool] (ExecutionManager.is_executed (DocumentManager.Internal.execution_state st) s2.id) false;
370+
[%test_eq: int option] (Option.map ~f:Stateid.to_int (DocumentManager.Internal.observe_id st)) None
371+
372+
let%test_unit "edit.edit_non_root_observe_id" =
373+
let st, init_events = init_test_doc ~text:"Definition x := 1. Definition y := 2. Definition z := 3." in
374+
let st, (s1, (s2, (s3, ()))) = dm_parse st (P(P(P O))) in
375+
let st, events = DocumentManager.interpret_to_end st in
376+
let todo = Sel.Todo.(add empty init_events) in
377+
let todo = Sel.Todo.(add todo events) in
378+
let st = handle_events todo st in
379+
let st = edit_text st ~start:19 ~stop:37 ~text:"Definition y := 4." in
380+
[%test_eq: bool] (ExecutionManager.is_executed (DocumentManager.Internal.execution_state st) s3.id) false;
381+
[%test_eq: int option] (Option.map ~f:Stateid.to_int (DocumentManager.Internal.observe_id st))
382+
(Some (Stateid.to_int s1.id))

0 commit comments

Comments
 (0)