@@ -252,10 +252,11 @@ let register_rewrite_rules rules env =
252252 symb_pats = List. fold_left (fun symb_pats (c , r ) -> Cmap_env. update c (add c r) symb_pats) env.symb_pats rules.rewrules_rules
253253 }
254254
255- let sync_rewrite_rules prev_rules env =
255+ let sync_rewrite_rules ~ type_mode prev_rules env =
256256 let rrset = match get_enabled_rewrite_rules env with rrset -> rrset | exception RewriteRulesNotAllowed _ ->
257257 anomaly Pp. (str" Trying to remove \" -allowed-rewrite-rules\" flag" )
258258 in
259+ let rrset = if type_mode then Option. default rrset env.env_typing_flags.enabled_rewrite_rules_type else rrset in
259260 let prev_rules = Option. default RRset. empty prev_rules in
260261 (* Efficient symmetric difference function ? *)
261262 let new_rules, removed_rules = RRset. diff rrset prev_rules, RRset. diff prev_rules rrset in
@@ -271,8 +272,30 @@ let sync_rewrite_rules prev_rules env =
271272 register_rewrite_rules rr env)
272273 rules_to_add env
273274
275+ let rewrite_rules_type_different env = Option. has_some env.env_typing_flags.enabled_rewrite_rules_type
276+
277+ let resync_rewrite_rules_type env =
278+ if rewrite_rules_type_different env then
279+ sync_rewrite_rules ~type_mode: false None env
280+ else
281+ env
282+
283+ let resync_rewrite_rules_body env =
284+ let type_rr = env.env_typing_flags.enabled_rewrite_rules_type in
285+ if Option. has_some type_rr then
286+ sync_rewrite_rules ~type_mode: false type_rr env
287+ else
288+ env
289+
274290let enable_rewrite_rules_flags kn flags =
275- { flags with enabled_rewrite_rules = Some (RRset. add kn (get_enabled_rewrite_rules_flags flags)) }
291+ { flags with
292+ enabled_rewrite_rules = Some (RRset. add kn (get_enabled_rewrite_rules_flags flags));
293+ enabled_rewrite_rules_type = Option. map (RRset. add kn) flags.enabled_rewrite_rules_type; }
294+
295+ let enable_rewrite_rules_body_flags kn flags =
296+ { flags with
297+ enabled_rewrite_rules = Some (RRset. add kn (get_enabled_rewrite_rules_flags flags));
298+ enabled_rewrite_rules_type = Some (get_enabled_rewrite_rules_flags flags) }
276299
277300let enable_rewrite_rules kn env =
278301 let env = { env with env_typing_flags = enable_rewrite_rules_flags kn env.env_typing_flags } in
@@ -565,6 +588,7 @@ let same_flags {
565588 sprop_allowed;
566589 allow_uip;
567590 enabled_rewrite_rules;
591+ enabled_rewrite_rules_type;
568592 } alt =
569593 check_guarded == alt.check_guarded &&
570594 check_positive == alt.check_positive &&
@@ -577,23 +601,29 @@ let same_flags {
577601 impredicative_set == alt.impredicative_set &&
578602 sprop_allowed == alt.sprop_allowed &&
579603 allow_uip == alt.allow_uip &&
580- enabled_rewrite_rules == alt.enabled_rewrite_rules
604+ enabled_rewrite_rules == alt.enabled_rewrite_rules &&
605+ enabled_rewrite_rules_type == alt.enabled_rewrite_rules_type
581606[@ warning " +9" ]
582607
583608let set_type_in_type b = map_universes (UGraph. set_type_in_type b)
584609
585- let set_typing_flags c env =
610+ let set_typing_flags ? type_mode c env =
586611 if same_flags env.env_typing_flags c then env
587612 else
613+ let () = if Option. is_empty type_mode && Option. has_some c.enabled_rewrite_rules_type then
614+ CErrors. user_err Pp. (str" Body rewrite rules are only supported for opaque definitions" )
615+ in
616+ let type_mode = Option. default false type_mode in
588617 let newenv = { env with env_typing_flags = c } in
589618 let newenv = set_type_in_type (not c.check_universes) newenv in
590- if env.env_typing_flags.enabled_rewrite_rules == c.enabled_rewrite_rules then
619+ if env.env_typing_flags.enabled_rewrite_rules == c.enabled_rewrite_rules &&
620+ env.env_typing_flags.enabled_rewrite_rules_type == c.enabled_rewrite_rules_type then
591621 newenv
592622 else
593- sync_rewrite_rules env.env_typing_flags.enabled_rewrite_rules newenv
623+ sync_rewrite_rules ~type_mode ( if type_mode then env.env_typing_flags.enabled_rewrite_rules_type else env.env_typing_flags. enabled_rewrite_rules) newenv
594624
595- let update_typing_flags ?typing_flags env =
596- Option. cata (fun flags -> set_typing_flags flags env) env typing_flags
625+ let update_typing_flags ?type_mode ? typing_flags env =
626+ Option. cata (fun flags -> set_typing_flags ?type_mode flags env) env typing_flags
597627
598628let set_impredicative_set b env =
599629 set_typing_flags {env.env_typing_flags with impredicative_set= b} env
0 commit comments