@@ -110,12 +110,24 @@ let parse_program_for_syntax_error = (~name=?, lexbuf, source) => {
110110let cached_parsetrees = Hashtbl . create(64 );
111111let reset = () => Hashtbl . clear(cached_parsetrees);
112112
113- let get_cached_parsetree = name => {
114- Option . fold(~none= None , ~some= Hashtbl . find_opt(cached_parsetrees), name);
113+ let get_cached_parsetree = (name, source) => {
114+ switch (
115+ Option . fold(~none= None , ~some= Hashtbl . find_opt(cached_parsetrees), name)
116+ ) {
117+ | Some ((cached_source , cached_program ))
118+ when cached_source == Hashtbl . hash(source) =>
119+ Some (cached_program)
120+ | _ => None
121+ };
122+ };
123+
124+ let add_cached_parsetree = (name, source, program) => {
125+ Hashtbl . add(cached_parsetrees, name, (Hashtbl . hash(source), program));
115126};
116127
117128let parse = (~name=?, lexbuf, source): Parsetree . parsed_program => {
118- switch (get_cached_parsetree(name)) {
129+ let source = source() ;
130+ switch (get_cached_parsetree(name, source)) {
119131 | Some (cached ) => cached
120132 | None =>
121133 Sedlexing . set_position(lexbuf, Location . start_pos);
@@ -133,7 +145,6 @@ let parse = (~name=?, lexbuf, source): Parsetree.parsed_program => {
133145 | Parser . Error =>
134146 // Fast parse failed, so now we do a slow, thoughtful parse to produce a
135147 // good error message.
136- let source = source() ;
137148 ignore @@
138149 parse_program_for_syntax_error(
139150 ~name? ,
@@ -144,7 +155,7 @@ let parse = (~name=?, lexbuf, source): Parsetree.parsed_program => {
144155 failwith ("Impossible: Program with syntax error raised no error" );
145156 };
146157 switch (name) {
147- | Some (name ) => Hashtbl . add(cached_parsetrees , name , program)
158+ | Some (name ) => add_cached_parsetree(name , source , program)
148159 | None => ()
149160 };
150161 program;
0 commit comments