From 01be9fb1fdeb7c838e8606e9072bfd12fe9c0b4f Mon Sep 17 00:00:00 2001 From: Valentin Perrelle <valentin.perrelle@cea.fr> Date: Tue, 28 Mar 2023 17:29:15 +0200 Subject: [PATCH] [Dive] Resurect the enum for DiveRange inside DiveSpecialRange --- ivette/src/frama-c/plugins/dive/api/index.ts | 36 ++++++++++++++++++-- src/plugins/dive/server_interface.ml | 30 ++++++++++++---- 2 files changed, 58 insertions(+), 8 deletions(-) diff --git a/ivette/src/frama-c/plugins/dive/api/index.ts b/ivette/src/frama-c/plugins/dive/api/index.ts index 530ef60bda5..a00d03ce47d 100644 --- a/ivette/src/frama-c/plugins/dive/api/index.ts +++ b/ivette/src/frama-c/plugins/dive/api/index.ts @@ -286,11 +286,43 @@ const explorationTags_internal: Server.GetRequest<null,tag[]> = { export const explorationTags: Server.GetRequest<null,tag[]>= explorationTags_internal; /** A qualitative description of the range of values that this node can take. */ -export type nodeRange = number | string; +export enum nodeSpecialRange { + /** no value ever computed for this node */ + empty = 'empty', + /** this node can only have one value */ + singleton = 'singleton', + /** this node can take almost all values of its type */ + wide = 'wide', +} + +/** Decoder for `nodeSpecialRange` */ +export const jNodeSpecialRange: Json.Decoder<nodeSpecialRange> = + Json.jEnum(nodeSpecialRange); + +/** Natural order for `nodeSpecialRange` */ +export const byNodeSpecialRange: Compare.Order<nodeSpecialRange> = + Compare.byEnum(nodeSpecialRange); + +/** Default value for `nodeSpecialRange` */ +export const nodeSpecialRangeDefault: nodeSpecialRange = + nodeSpecialRange.empty; + +const nodeSpecialRangeTags_internal: Server.GetRequest<null,tag[]> = { + kind: Server.RqKind.GET, + name: 'plugins.dive.nodeSpecialRangeTags', + input: Json.jNull, + output: Json.jArray(jTag), + signals: [], +}; +/** Registered tags for the above type. */ +export const nodeSpecialRangeTags: Server.GetRequest<null,tag[]>= nodeSpecialRangeTags_internal; + +/** A qualitative or quantitative description of the range of values that this node can take. */ +export type nodeRange = number | nodeSpecialRange; /** Decoder for `nodeRange` */ export const jNodeRange: Json.Decoder<nodeRange> = - Json.jUnion<number | string>( Json.jNumber, Json.jString,); + Json.jUnion<number | nodeSpecialRange>( Json.jNumber, jNodeSpecialRange,); /** Natural order for `nodeRange` */ export const byNodeRange: Compare.Order<nodeRange> = Compare.structural; diff --git a/src/plugins/dive/server_interface.ml b/src/plugins/dive/server_interface.ml index b6b479669f5..3841de7aab8 100644 --- a/src/plugins/dive/server_interface.ml +++ b/src/plugins/dive/server_interface.ml @@ -230,17 +230,35 @@ module Computation = struct include (val publish lookup "exploration" descr) end -module NodeRange = struct - type t = node_range +module NodeSpecialRange = struct + include Enum (struct type t = node_range end) + + let empty = tag "empty" "no value ever computed for this node" + let singleton = tag "singleton" "this node can only have one value" + let wide = tag "wide" "this node can take almost all values of its type" + + let lookup = function + | Empty -> empty + | Singleton -> singleton + | Wide -> wide + | Normal _ -> raise Not_found + let descr = "A qualitative description of the range of values \ that this node can take." - let jtype = declare "nodeRange" ~descr (Junion [ Jnumber ; Jstring ]) + + include (val publish lookup "nodeSpecialRange" descr) +end + +module NodeRange = struct + type t = node_range + let descr = "A qualitative or quantitative description of the range of \ + values that this node can take." + let jtype = declare "nodeRange" ~descr + (Junion [ Jnumber ; NodeSpecialRange.jtype ]) let to_json = function - | Empty -> `String "empty" - | Singleton -> `String "singleton" | Normal range_grade -> `Int range_grade - | Wide -> `String "wide" + | range -> NodeSpecialRange.to_json range let of_json _ = Data.failure "NodeRange.of_json not implemented" end -- GitLab