From da1e2f3475eb69f668753c5499520b261e68d0a1 Mon Sep 17 00:00:00 2001
From: Allan Blanchard <allan.blanchard@cea.fr>
Date: Wed, 29 Jan 2020 14:06:20 +0100
Subject: [PATCH] [Kernel] Clean ACSL extensions

---
 .../ast_printing/cil_printer.ml               | 57 ++++++++++---------
 .../ast_queries/acsl_extension.mli            |  2 -
 src/kernel_services/ast_queries/cil.ml        | 36 +++++++-----
 src/kernel_services/ast_queries/logic_env.ml  | 38 +++++++------
 .../ast_queries/logic_typing.ml               | 31 +++++-----
 5 files changed, 93 insertions(+), 71 deletions(-)

diff --git a/src/kernel_services/ast_printing/cil_printer.ml b/src/kernel_services/ast_printing/cil_printer.ml
index 431a6194222..5aa6db6a1c5 100644
--- a/src/kernel_services/ast_printing/cil_printer.ml
+++ b/src/kernel_services/ast_printing/cil_printer.ml
@@ -27,42 +27,47 @@ open Cil_datatype
 open Printer_api
 open Format
 
-let initialized_extensions = ref false
-let ref_print_extension = ref (fun _ _ _ _ -> assert false)
-let ref_print_short_extension = ref (fun _ _ _ _ -> assert false)
-
-let set_extension_handler ~print ~short_print =
-  assert (not !initialized_extensions) ;
-  ref_print_extension := print ;
-  ref_print_short_extension := short_print ;
-  initialized_extensions := true ;
-  ()
-
-let ref_deprecated_extension_handler = ref (fun _ _ _ -> assert false)
-let set_deprecated_extension_handler ~handler =
-  ref_deprecated_extension_handler := handler
-
-module Acsl_extensions = struct
-  let deprecated_register name =
-    !ref_deprecated_extension_handler name
+module Extensions = struct
+  let initialized = ref false
+  let ref_print = ref (fun _ _ _ _ -> assert false)
+  let ref_short_print = ref (fun _ _ _ _ -> assert false)
+
+  let set_handler ~print ~short_print =
+    assert (not !initialized) ;
+    ref_print := print ;
+    ref_short_print := short_print ;
+    initialized := true ;
+    ()
 
   let pp (printer) fmt {ext_name; ext_kind} =
-    !ref_print_extension ext_name printer fmt ext_kind
+    !ref_print ext_name printer fmt ext_kind
 
   let pp_short (printer) fmt {ext_name; ext_kind} =
-    !ref_print_short_extension ext_name printer fmt ext_kind
+    !ref_short_print ext_name printer fmt ext_kind
+
+  let ref_deprecated_handler = ref (fun _ _ _ -> assert false)
+  let set_deprecated_handler ~handler =
+    ref_deprecated_handler := handler
+
+  let deprecated_register name =
+    !ref_deprecated_handler name
 end
+let set_extension_handler = Extensions.set_handler
+
+(* Deprecated functions *)
+let set_deprecated_extension_handler = Extensions.set_deprecated_handler
+
 let register_behavior_extension name =
-  Acsl_extensions.deprecated_register name Ext_contract
+  Extensions.deprecated_register name Ext_contract
 
 let register_code_annot_extension name =
-  Acsl_extensions.deprecated_register name (Ext_code_annot Ext_here)
+  Extensions.deprecated_register name (Ext_code_annot Ext_here)
 
 let register_loop_annot_extension name =
-  Acsl_extensions.deprecated_register name (Ext_code_annot Ext_next_loop)
+  Extensions.deprecated_register name (Ext_code_annot Ext_next_loop)
 
 let register_global_extension name =
-  Acsl_extensions.deprecated_register name Ext_global
+  Extensions.deprecated_register name Ext_global
 
 (* Internal attributes. Won't be pretty-printed *)
 let reserved_attributes = ref []
@@ -2752,10 +2757,10 @@ class cil_printer () = object (self)
       self#identified_predicate p
 
   method extended fmt ext =
-    Acsl_extensions.pp (self :> extensible_printer_type) fmt ext
+    Extensions.pp (self :> extensible_printer_type) fmt ext
 
   method short_extended fmt ext =
-    Acsl_extensions.pp_short (self :> extensible_printer_type) fmt ext
+    Extensions.pp_short (self :> extensible_printer_type) fmt ext
 
   method post_cond fmt (k,p) =
     let kw = get_termination_kind_name k in
diff --git a/src/kernel_services/ast_queries/acsl_extension.mli b/src/kernel_services/ast_queries/acsl_extension.mli
index 42e2a3b0636..08a181d4ab4 100644
--- a/src/kernel_services/ast_queries/acsl_extension.mli
+++ b/src/kernel_services/ast_queries/acsl_extension.mli
@@ -24,8 +24,6 @@ open Cil_types
 open Logic_typing
 open Logic_ptree
 
-type extension
-
 type extension_preprocessor =
   lexpr list -> lexpr list
 type extension_typer =
diff --git a/src/kernel_services/ast_queries/cil.ml b/src/kernel_services/ast_queries/cil.ml
index dc24efcd495..2b2014430b2 100644
--- a/src/kernel_services/ast_queries/cil.ml
+++ b/src/kernel_services/ast_queries/cil.ml
@@ -755,21 +755,31 @@ let alphabetabeta _ x = x
 let alphabetafalse _ _ = false
 let alphatrue _ = true
 
-let initialized_extensions = ref false
-let ref_visit_extension = ref (fun _ _ _ -> assert false)
+module Extensions = struct
+  let initialized = ref false
+  let ref_visit = ref (fun _ _ _ -> assert false)
 
-let set_extension_handler ~visit =
-  assert (not !initialized_extensions) ;
-  ref_visit_extension := visit ;
-  initialized_extensions := true ;
-  ()
+  let set_handler ~visit =
+    assert (not !initialized) ;
+    ref_visit := visit ;
+    initialized := true ;
+    ()
+
+  let visit name = !ref_visit name
+
+  let ref_deprecated_handler = ref (fun _ _ _ -> assert false)
+  let set_deprecated_handler ~handler =
+    ref_deprecated_handler := handler
+
+  let register_behavior name ext =
+    !ref_deprecated_handler name Ext_contract ext
+end
+let set_extension_handler = Extensions.set_handler
 
-let ref_deprecated_extension_handler = ref (fun _ _ _ -> assert false)
-let set_deprecated_extension_handler ~handler =
-  ref_deprecated_extension_handler := handler
+(* Deprecated *)
+let set_deprecated_extension_handler = Extensions.set_deprecated_handler
+let register_behavior_extension = Extensions.register_behavior
 
-let register_behavior_extension name ext =
-  !ref_deprecated_extension_handler name Ext_contract ext
 
 (* sm/gn: cil visitor interface for traversing Cil trees. *)
 (* Use visitCilStmt and/or visitCilFile to use this. *)
@@ -1901,7 +1911,7 @@ and childrenBehavior vis b =
   b
 
 and visitCilExtended vis orig =
-  let visit = !ref_visit_extension orig.ext_name in
+  let visit = Extensions.visit orig.ext_name in
   let e' = doVisitCil vis id (visit vis) childrenCilExtended orig.ext_kind in
   if Visitor_behavior.is_fresh vis#behavior then
     Logic_const.new_acsl_extension orig.ext_name orig.ext_loc
diff --git a/src/kernel_services/ast_queries/logic_env.ml b/src/kernel_services/ast_queries/logic_env.ml
index fdadf34d678..6d040a71c18 100644
--- a/src/kernel_services/ast_queries/logic_env.ml
+++ b/src/kernel_services/ast_queries/logic_env.ml
@@ -24,22 +24,28 @@
 
 open Cil_types
 
-let initialized_extensions = ref false
-let ref_is_extension = ref (fun _ -> assert false)
-let ref_extension_category = ref (fun _ -> assert false)
-let ref_preprocess_extension = ref (fun _ -> assert false)
-
-let set_extension_handler ~category ~is_extension ~preprocess =
-  assert (not !initialized_extensions) ;
-  ref_is_extension := is_extension ;
-  ref_extension_category := category ;
-  ref_preprocess_extension := preprocess ;
-  initialized_extensions := true ;
-  ()
-
-let is_extension s = !ref_is_extension s
-let extension_category s = !ref_extension_category s
-let preprocess_extension s = !ref_preprocess_extension s
+module Extensions = struct
+  let initialized = ref false
+  let ref_is_extension = ref (fun _ -> assert false)
+  let ref_category = ref (fun _ -> assert false)
+  let ref_preprocess = ref (fun _ -> assert false)
+
+  let set_extension_handler ~category ~is_extension ~preprocess =
+    assert (not !initialized) ;
+    ref_is_extension := is_extension ;
+    ref_category := category ;
+    ref_preprocess := preprocess ;
+    initialized := true ;
+    ()
+
+  let is_extension s = !ref_is_extension s
+  let category s = !ref_category s
+  let preprocess s = !ref_preprocess s
+end
+let set_extension_handler = Extensions.set_extension_handler
+let is_extension = Extensions.is_extension
+let extension_category = Extensions.category
+let preprocess_extension = Extensions.preprocess
 
 module CurrentLoc = Cil_const.CurrentLoc
 
diff --git a/src/kernel_services/ast_queries/logic_typing.ml b/src/kernel_services/ast_queries/logic_typing.ml
index aa3797f02bf..e7f783a7582 100644
--- a/src/kernel_services/ast_queries/logic_typing.ml
+++ b/src/kernel_services/ast_queries/logic_typing.ml
@@ -525,33 +525,36 @@ type typing_context = {
 }
 
 module Extensions = struct
-  let initialized_extensions = ref false
+  let initialized = ref false
   let ref_is_extension = ref (fun _ -> assert false)
-  let ref_type_extension = ref (fun _ _ _ _ -> assert false)
+  let ref_typer = ref (fun _ _ _ _ -> assert false)
+
+  let set_handler ~is_extension ~typer =
+    assert (not !initialized) ;
+    ref_is_extension := is_extension ;
+    ref_typer := typer ;
+    initialized := true
 
   let is_extension name = !ref_is_extension name
 
   let typer name ~typing_context:typing_context ~loc =
-    !ref_type_extension name typing_context loc
+    !ref_typer name typing_context loc
 
   (* For deprecated functions *)
-  let ref_deprecated_extension_handler = ref (fun _ _ _ _  -> assert false)
+  let ref_deprecated_handler = ref (fun _ _ _ _  -> assert false)
+
+  let set_deprecated_handler ~handler =
+    ref_deprecated_handler := handler
 
   let deprecated_register name category status typer =
     let typer typing_context loc = typer ~typing_context ~loc in
-    !ref_deprecated_extension_handler name category status typer
+    !ref_deprecated_handler name category status typer
 end
-
-let set_extension_handler ~is_extension ~typer =
-  assert (not !Extensions.initialized_extensions) ;
-  Extensions.ref_is_extension := is_extension ;
-  Extensions.ref_type_extension := typer ;
-  Extensions.initialized_extensions := true ;
-  ()
+let set_extension_handler = Extensions.set_handler
 
 (* Deprecated ACSL extensions functions *)
-let set_deprecated_extension_handler ~handler =
-  Extensions.ref_deprecated_extension_handler := handler
+let set_deprecated_extension_handler =
+  Extensions.set_deprecated_handler
 
 let register_behavior_extension name f =
   Extensions.deprecated_register name Ext_contract f
-- 
GitLab