diff --git a/src/plugins/server/kernel_ast.ml b/src/plugins/server/kernel_ast.ml index 21f6d0abeb19a78e6d158aa8886e7d510c3a1a5a..b6417eaa7cd4dc825dea6e2419f119401d182f63 100644 --- a/src/plugins/server/kernel_ast.ml +++ b/src/plugins/server/kernel_ast.ml @@ -41,6 +41,41 @@ let () = Request.register ~page (* --- Printers --- *) (* -------------------------------------------------------------------------- *) +(* The kind of a marker. *) +module MarkerKind = struct + let t = + Enum.dictionary ~page ~name:"markerkind" ~title:"Marker kind" + ~descr:(Md.plain "Marker kind") () + + let kind name = Enum.tag t ~name ~descr:(Md.plain name) () + let expr = kind "expression" + let lval = kind "lvalue" + let var = kind "variable" + let fct = kind "function" + let decl = kind "declaration" + let stmt = kind "statement" + let glob = kind "global" + let term = kind "term" + let prop = kind "property" + + let tag = + let open Printer_tag in + function + | PStmt _ -> stmt + | PStmtStart _ -> stmt + | PVDecl _ -> decl + | PLval (_, _, (Var vi, NoOffset)) -> + if Cil.isFunctionType vi.vtype then fct else var + | PLval _ -> lval + | PExp _ -> expr + | PTermLval _ -> term + | PGlobal _ -> glob + | PIP _ -> prop + + let data = Enum.publish t ~tag () + include (val data : S with type t = Printer_tag.localizable) +end + module Marker = struct @@ -75,6 +110,39 @@ struct let default = index end) + let get_name = function + | PLval (_, _, (Var vi, NoOffset)) -> Some vi.vname + | PLval (_, _, lval) -> Some (Format.asprintf "%a" Printer.pp_lval lval) + | PExp (_, _, expr) -> Some (Format.asprintf "%a" Printer.pp_exp expr) + | PStmt _ | PStmtStart _ | PVDecl _ + | PTermLval _ | PGlobal _| PIP _ -> None + + let iter f = + Localizable.Hashtbl.iter (fun key str -> f (key, str)) (STATE.get ()).tags + + let array = + let model = States.model () in + let () = + States.column ~model + ~name:"kind" ~descr:(Md.plain "Marker kind") + ~data:(module MarkerKind) ~get:fst () + in + let () = + States.column ~model + ~name:"name" + ~descr:(Md.plain "Marker identifier for the end-user, if any") + ~data:(module Jstring.Joption) + ~get:(fun (tag, _) -> get_name tag) + () + in + States.register_array + ~page + ~name:"kernel.ast.markerKind" + ~descr:(Md.plain "Kind of markers") + ~key:snd + ~iter + model + let create_tag = function | PStmt(_,s) -> Printf.sprintf "#s%d" s.sid | PStmtStart(_,s) -> Printf.sprintf "#k%d" s.sid @@ -92,6 +160,7 @@ struct let tag = create_tag loc in Localizable.Hashtbl.add tags loc tag ; Hashtbl.add locs tag loc ; + States.update array (loc, tag); tag let lookup tag = Hashtbl.find (STATE.get()).locs tag