@@ -107,7 +107,7 @@ type parse_state = {
107
107
loc : Loc .t option ;
108
108
synterp_state : Vernacstate.Synterp .t ;
109
109
stream : (unit , char ) Gramlib.Stream .t ;
110
- raw : RawDocument .t ;
110
+ raw : RawDocument .t option ;
111
111
parsed : pre_sentence list ;
112
112
errors : parsing_error list ;
113
113
parsed_comments : comment list ;
@@ -522,15 +522,15 @@ let handle_parse_error start msg qf ({stream; errors;} as parse_state) =
522
522
let errors = parsing_error :: errors in
523
523
let parse_state = {parse_state with errors} in
524
524
(* TODO: we could count the \n between start and stop and increase Loc.line_nb *)
525
- create_parsing_event ( ParseEvent parse_state)
525
+ ParseEvent parse_state
526
526
527
527
let handle_parse_more ({loc; synterp_state; stream; raw; parsed; parsed_comments} as parse_state ) =
528
528
let start = Stream. count stream in
529
529
log @@ " Start of parse is: " ^ (string_of_int start);
530
530
begin
531
531
(* FIXME should we save lexer state? *)
532
532
match parse_one_sentence ?loc stream ~st: synterp_state with
533
- | None , _ (* EOI *) -> create_parsing_event ( Invalidate parse_state)
533
+ | None , _ (* EOI *) -> Invalidate parse_state
534
534
| Some ast , comments ->
535
535
let stop = Stream. count stream in
536
536
log @@ " Parsed: " ^ (Pp. string_of_ppcmds @@ Ppvernac. pr_vernac ast);
@@ -539,13 +539,14 @@ let handle_parse_more ({loc; synterp_state; stream; raw; parsed; parsed_comments
539
539
| Some lc -> lc.line_nb, lc.bp, lc.ep
540
540
| None -> assert false
541
541
in
542
- let tokens = match raw with
543
- | None -> []
544
- | Some raw ->
545
- let str = String. sub (RawDocument. text raw) begin_char (end_char - begin_char) in
546
- let sstr = Stream. of_string str in
547
- let lex = CLexer.Lexer. tok_func sstr in
548
- stream_tok 0 [] lex begin_line begin_char in
542
+ let tokens = match raw with
543
+ | None -> []
544
+ | Some raw ->
545
+ let str = String. sub (RawDocument. text raw) begin_char (end_char - begin_char) in
546
+ let sstr = Stream. of_string str in
547
+ let lex = CLexer.Lexer. tok_func sstr in
548
+ stream_tok 0 [] lex begin_line begin_char
549
+ in
549
550
begin
550
551
try
551
552
let entry = get_entry ast in
@@ -557,7 +558,7 @@ let handle_parse_more ({loc; synterp_state; stream; raw; parsed; parsed_comments
557
558
let parsed_comments = List. append comments parsed_comments in
558
559
let loc = ast.loc in
559
560
let parse_state = {parse_state with parsed_comments; parsed; loc; synterp_state} in
560
- create_parsing_event ( ParseEvent parse_state)
561
+ ParseEvent parse_state
561
562
with exn ->
562
563
let e, info = Exninfo. capture exn in
563
564
let loc = get_loc_from_info_or_exn e info in
@@ -639,7 +640,7 @@ let validate_document ({ parsed_loc; raw_doc; cancel_handle } as document) =
639
640
while Stream. count stream < stop do Stream. junk () stream done ;
640
641
log @@ Format. sprintf " Parsing more from pos %i" stop;
641
642
let started = Unix. gettimeofday () in
642
- let parsed_state = {stop; top_id;synterp_state; stream; raw= raw_doc; parsed= [] ; errors= [] ; parsed_comments= [] ; loc= None ; started; previous_document= document} in
643
+ let parsed_state = {stop; top_id;synterp_state; stream; raw= ( Some raw_doc) ; parsed= [] ; errors= [] ; parsed_comments= [] ; loc= None ; started; previous_document= document} in
643
644
let priority = Some PriorityManager. parsing in
644
645
let event = Sel. now ?priority (ParseEvent parsed_state) in
645
646
let cancel_handle = Some (Sel.Event. get_cancellation_handle event) in
@@ -672,19 +673,29 @@ let handle_invalidate {parsed; errors; parsed_comments; stop; top_id; started; p
672
673
let handle_event document = function
673
674
| ParseEvent state ->
674
675
let event = handle_parse_more state in
676
+ let event = create_parsing_event event in
675
677
let cancel_handle = Some (Sel.Event. get_cancellation_handle event) in
676
678
{document with cancel_handle}, [event], None
677
679
| Invalidate state -> {document with cancel_handle= None }, [] , handle_invalidate state document
678
680
681
+ let rec parse_full = function
682
+ | ParseEvent state ->
683
+ let event = handle_parse_more state in
684
+ parse_full event
685
+ | Invalidate state ->
686
+ state
687
+
679
688
let parse_text_at_loc loc text document =
680
- let (_, synterp_state, scheduler_state) = state_strictly_before document loc in
689
+ let top_id = Option. map (fun sentence -> sentence.id) (find_sentence_strictly_before document loc) in
690
+ let (stop, synterp_state, scheduler_state) = state_strictly_before document loc in
681
691
let stream = Stream. of_string text in
682
- let new_sentences, _ = parse_more synterp_state stream None in
692
+ let parsed_state = {synterp_state; started = Unix. gettimeofday () ; top_id; stream; raw= None ; loc= None ; errors= [] ; parsed= [] ; parsed_comments= [] ; previous_document= document; stop} in
693
+ let {parsed} = parse_full (ParseEvent parsed_state) in
683
694
let add_sentence (sentences , schedule , scheduler_state ) ({ parsing_start; start; stop; ast; synterp_state } : pre_sentence ) =
684
695
let added_sentence, schedule, schedule_state = pre_sentence_to_sentence parsing_start start stop ast synterp_state scheduler_state schedule in
685
696
sentences @ [added_sentence], schedule, schedule_state
686
697
in
687
- let sentences, schedule, _ = List. fold_left add_sentence ([] ,document.schedule, scheduler_state) new_sentences in
698
+ let sentences, schedule, _ = List. fold_left add_sentence ([] ,document.schedule, scheduler_state) parsed in
688
699
sentences, schedule
689
700
690
701
let create_document init_synterp_state text =
0 commit comments