From 9c480a7394747023cec9043fdae335c6f7dc760c Mon Sep 17 00:00:00 2001 From: Allan Blanchard <allan.blanchard@cea.fr> Date: Tue, 28 Jan 2020 16:14:07 +0100 Subject: [PATCH] [ACSL ext] Hides some implementation details --- .../ast_queries/acsl_extension.ml | 66 +++++++++---------- .../ast_queries/acsl_extension.mli | 37 ++++++----- src/plugins/value/utils/eva_annotations.ml | 6 +- src/plugins/value/utils/widen_hints_ext.ml | 6 +- src/plugins/wp/RegionAnnot.ml | 6 +- src/plugins/wp/dyncall.ml | 4 +- tests/spec/Extend.ml | 36 +++++----- tests/spec/Extend_preprocess.ml | 8 +-- tests/spec/extend_extern.ml | 4 +- 9 files changed, 82 insertions(+), 91 deletions(-) diff --git a/src/kernel_services/ast_queries/acsl_extension.ml b/src/kernel_services/ast_queries/acsl_extension.ml index b8b92d6f74a..93c4d883ef2 100644 --- a/src/kernel_services/ast_queries/acsl_extension.ml +++ b/src/kernel_services/ast_queries/acsl_extension.ml @@ -24,46 +24,46 @@ open Cil_types open Logic_typing open Logic_ptree -type extension_info = { - ext_status: bool ; - ext_preprocess: extension_preprocessing ; - ext_typing: extension_typing ; - ext_visit: extension_visit ; - ext_printing: extension_printing ; +type extension = { + status: bool ; + preprocessor: extension_preprocessor ; + typer: extension_typer ; + visitor: extension_visitor ; + printer: extension_printer ; } -and extension_preprocessing = +and extension_preprocessor = lexpr list -> lexpr list -and extension_typing = +and extension_typer = typing_context -> location -> lexpr list -> acsl_extension_kind -and extension_visit = +and extension_visitor = Cil.cilVisitor -> acsl_extension_kind -> acsl_extension_kind Cil.visitAction -and extension_printing = +and extension_printer = Printer_api.extensible_printer_type -> Format.formatter -> acsl_extension_kind -> unit (* Default extension *) -let default_preprocessing = Extlib.id +let default_preprocessor = Extlib.id -let default_typing typing_context loc l = +let default_typer typing_context loc l = let _ = loc in let typing = typing_context.type_predicate typing_context (Lenv.empty ()) in Ext_preds (List.map typing l) -let default_visit _ _ = Cil.DoChildren +let default_visitor _ _ = Cil.DoChildren -let default_printing printer fmt = function +let default_printer printer fmt = function | Ext_id i -> Format.fprintf fmt "%d" i | Ext_terms ts -> Pretty_utils.pp_list ~sep:",@ " printer#term fmt ts | Ext_preds ps -> Pretty_utils.pp_list ~sep:",@ " printer#predicate fmt ps -let default = { - ext_status = false ; - ext_preprocess = default_preprocessing ; - ext_typing = default_typing ; - ext_printing = default_printing ; - ext_visit = default_visit ; -} +let make + ?(status=false) + ?(preprocessor=default_preprocessor) + ?(typer=default_typer) + ?(visitor=default_visitor) + ?(printer=default_printer) + () = { status ; preprocessor ; typer ; visitor ; printer } module Extensions = struct let ext_tbl = Hashtbl.create 5 @@ -85,16 +85,16 @@ module Extensions = struct name else Hashtbl.add ext_tbl name (category, info) - let preprocess name = (find name).ext_preprocess + let preprocess name = (find name).preprocessor let typing name typing_context loc es = let ext_info = find name in - let status = ext_info.ext_status in - let typer = ext_info.ext_typing in + let status = ext_info.status in + let typer = ext_info.typer in status, (typer typing_context loc es) - let print name = (find name).ext_printing - let visit name = (find name).ext_visit + let print name = (find name).printer + let visit name = (find name).visitor end (* Registration *) @@ -137,7 +137,7 @@ let deprecated_find ?(strong=true) name cat op_name = match Hashtbl.find_opt Extensions.ext_tbl name with | None -> if strong then Hashtbl.add strong_cat name cat ; - (cat, default) + (cat, make ()) | Some (found_cat, ext) -> if strong && Hashtbl.mem strong_cat name then begin if found_cat = cat then (cat, ext) @@ -152,19 +152,19 @@ let deprecated_find ?(strong=true) name cat op_name = end else (found_cat, ext) -let deprecated_register_typing name cat ext_status ext_typing = +let deprecated_register_typing name cat status typer = let cat, ext = deprecated_find name cat "typing" in - let ext = { ext with ext_status ; ext_typing } in + let ext = { ext with status ; typer } in deprecated_replace name (cat, ext) -let deprecated_register_printing name cat ext_printing = +let deprecated_register_printing name cat printer = let cat, ext = deprecated_find ~strong:false name cat "printing" in - let ext = { ext with ext_printing } in + let ext = { ext with printer } in deprecated_replace name (cat, ext) -let deprecated_register_visit name cat ext_visit = +let deprecated_register_visit name cat visitor = let cat, ext = deprecated_find name cat "visit" in - let ext = { ext with ext_visit } in + let ext = { ext with visitor } in deprecated_replace name (cat, ext) let () = diff --git a/src/kernel_services/ast_queries/acsl_extension.mli b/src/kernel_services/ast_queries/acsl_extension.mli index 8e9d0dae0db..d766cd9e077 100644 --- a/src/kernel_services/ast_queries/acsl_extension.mli +++ b/src/kernel_services/ast_queries/acsl_extension.mli @@ -24,28 +24,29 @@ open Cil_types open Logic_typing open Logic_ptree -type extension_info = { - ext_status: bool ; - ext_preprocess: extension_preprocessing ; - ext_typing: extension_typing ; - ext_visit: extension_visit ; - ext_printing: extension_printing ; -} -and extension_preprocessing = +type extension + +type extension_preprocessor = lexpr list -> lexpr list -and extension_typing = +type extension_typer = typing_context -> location -> lexpr list -> acsl_extension_kind -and extension_visit = +type extension_visitor = Cil.cilVisitor -> acsl_extension_kind -> acsl_extension_kind Cil.visitAction -and extension_printing = +type extension_printer = Printer_api.extensible_printer_type -> Format.formatter -> acsl_extension_kind -> unit -val default: extension_info +val make: + ?status:bool -> + ?preprocessor:extension_preprocessor -> + ?typer:extension_typer -> + ?visitor:extension_visitor -> + ?printer:extension_printer -> + unit -> extension -val register_behavior: string -> extension_info -> unit -val register_global: string -> extension_info -> unit -val register_code_annot: string -> extension_info -> unit -val register_code_annot_next_stmt: string -> extension_info -> unit -val register_code_annot_next_loop: string -> extension_info -> unit -val register_code_annot_next_both: string -> extension_info -> unit \ No newline at end of file +val register_behavior: string -> extension -> unit +val register_global: string -> extension -> unit +val register_code_annot: string -> extension -> unit +val register_code_annot_next_stmt: string -> extension -> unit +val register_code_annot_next_loop: string -> extension -> unit +val register_code_annot_next_both: string -> extension -> unit diff --git a/src/plugins/value/utils/eva_annotations.ml b/src/plugins/value/utils/eva_annotations.ml index 7424276f091..ca5a1f0913e 100644 --- a/src/plugins/value/utils/eva_annotations.ml +++ b/src/plugins/value/utils/eva_annotations.ml @@ -69,16 +69,16 @@ module Register (M : Annotation) = struct include M - let ext_typing typing_context loc args = + let typer typing_context loc args = try export (parse ~typing_context args) with Parse_error -> typing_context.Logic_typing.error loc "Invalid %s directive" name - let ext_printing _pp fmt lp = + let printer _pp fmt lp = print fmt (import lp) let () = - let ext = { Acsl_extension.default with ext_typing ; ext_printing } in + let ext = Acsl_extension.make ~typer ~printer () in if is_loop_annot then Acsl_extension.register_code_annot_next_loop name ext else diff --git a/src/plugins/value/utils/widen_hints_ext.ml b/src/plugins/value/utils/widen_hints_ext.ml index b86b353196a..90e2f8e3ada 100644 --- a/src/plugins/value/utils/widen_hints_ext.ml +++ b/src/plugins/value/utils/widen_hints_ext.ml @@ -137,14 +137,14 @@ let widen_hint_terms_of_terms terms = with Invalid_hint -> None -let ext_typing typing_context loc args = +let typer typing_context loc args = let var_term, hint_terms = terms_of_parsed_widen_hints typing_context loc args in let terms = var_term :: hint_terms in Ext_terms terms -let ext_printing _pp fmt ext = +let printer _pp fmt ext = match ext with | Ext_id _ -> assert false | Ext_preds _ -> assert false @@ -160,7 +160,7 @@ let ext_printing _pp fmt ext = let () = Acsl_extension.register_code_annot_next_both "widen_hints" - { Acsl_extension.default with ext_typing ; ext_printing } + (Acsl_extension.make ~typer ~printer ()) let get_widen_hints_annots stmt = Annotations.fold_code_annot diff --git a/src/plugins/wp/RegionAnnot.ml b/src/plugins/wp/RegionAnnot.ml index 2287453b699..e3b44d751e2 100644 --- a/src/plugins/wp/RegionAnnot.ml +++ b/src/plugins/wp/RegionAnnot.ml @@ -484,10 +484,8 @@ let register () = if Wp.Region.get () || Wp.Region_annot.get () || List.exists specified (Wp.Model.get ()) then - Acsl_extension.register_behavior "region" - { Acsl_extension.default with ext_status=true; - ext_typing=typecheck; - ext_printing=pp_extension} + Acsl_extension.(register_behavior "region" + (make ~status:true ~typer:typecheck ~printer:pp_extension ())) let () = Cmdline.run_after_configuring_stage register diff --git a/src/plugins/wp/dyncall.ml b/src/plugins/wp/dyncall.ml index 83aeeb8578a..8ddd80fe51d 100644 --- a/src/plugins/wp/dyncall.ml +++ b/src/plugins/wp/dyncall.ml @@ -261,9 +261,7 @@ let register = if (not !once) && Wp_parameters.DynCall.get () then begin once := true; - let ext = - { Acsl_extension.default with ext_status=true; ext_typing=typecheck } - in + let ext = Acsl_extension.make ~status:true ~typer:typecheck () in Acsl_extension.register_code_annot_next_stmt "calls" ext; Acsl_extension.register_behavior "instanceof" ext; end diff --git a/tests/spec/Extend.ml b/tests/spec/Extend.ml index ce95063c1e0..d29cffbb072 100644 --- a/tests/spec/Extend.ml +++ b/tests/spec/Extend.ml @@ -105,26 +105,22 @@ let type_bla typing_context _loc l = Ext_preds l let () = - Acsl_extension.register_behavior "foo" - { Acsl_extension.default with ext_typing = type_foo } ; - Acsl_extension.register_code_annot_next_loop "lfoo" - { Acsl_extension.default with ext_typing = type_foo } ; - Acsl_extension.register_code_annot "ca_foo" - { Acsl_extension.default with ext_typing = type_foo } ; - Acsl_extension.register_code_annot_next_stmt "ns_foo" - { Acsl_extension.default with ext_typing = type_foo } ; - Acsl_extension.register_global "global_foo" - { Acsl_extension.default with ext_typing = type_foo } ; - Acsl_extension.register_behavior "bar" - { Acsl_extension.default with - ext_typing = type_bar ; - ext_printing = print_bar ; - ext_visit = visit_bar - } ; - Acsl_extension.register_behavior "bla" - { Acsl_extension.default with ext_typing = type_bla } ; - Acsl_extension.register_code_annot_next_both "baz" - { Acsl_extension.default with ext_typing = type_baz } + Acsl_extension.(register_behavior "foo" + (make ~typer:type_foo ())) ; + Acsl_extension.(register_code_annot_next_loop "lfoo" + (make ~typer:type_foo ())) ; + Acsl_extension.(register_code_annot "ca_foo" + (make ~typer:type_foo ())) ; + Acsl_extension.(register_code_annot_next_stmt "ns_foo" + (make ~typer:type_foo ())) ; + Acsl_extension.(register_global "global_foo" + (make ~typer:type_foo ())) ; + Acsl_extension.(register_behavior "bar" + (make ~typer:type_bar ~printer:print_bar ~visitor:visit_bar ())) ; + Acsl_extension.(register_behavior "bla" + (make ~typer:type_bla ())) ; + Acsl_extension.(register_code_annot_next_both "baz" + (make ~typer:type_baz ())) let run () = Ast.compute (); diff --git a/tests/spec/Extend_preprocess.ml b/tests/spec/Extend_preprocess.ml index d2905255e14..32ff035e04f 100644 --- a/tests/spec/Extend_preprocess.ml +++ b/tests/spec/Extend_preprocess.ml @@ -37,11 +37,9 @@ let preprocess_foo_ptree_element kind = function let preprocess_foo_ptree kind = List.map (preprocess_foo_ptree_element kind) let register registration kind = - let ext = { - Acsl_extension.default with - ext_typing = ext_typing kind ; - ext_preprocess = preprocess_foo_ptree kind - } in + let typer = ext_typing kind in + let preprocessor = preprocess_foo_ptree kind in + let ext = Acsl_extension.make ~typer ~preprocessor () in registration (kind ^ "_foo") ext let () = diff --git a/tests/spec/extend_extern.ml b/tests/spec/extend_extern.ml index 09714efad25..c2e055f5f90 100644 --- a/tests/spec/extend_extern.ml +++ b/tests/spec/extend_extern.ml @@ -6,7 +6,7 @@ let load_theory = function raise Not_found | _ -> assert false -let ext_typing typing_context loc lexprs = +let typer typing_context loc lexprs = ignore loc ; let type_predicate = typing_context.type_predicate typing_context (Lenv.empty ()) @@ -17,7 +17,7 @@ let ext_typing typing_context loc lexprs = let () = - Acsl_extension.(register_global "why3" { default with ext_typing }) + Acsl_extension.(register_global "why3" (make ~typer ())) let main () = try -- GitLab