sig
  type key = P.t
  module Dash :
    sig
      val self : State.t
      val name : string
      val kind : State.kind
      val mark_as_computed : ?project:Project.t -> unit -> unit
      val is_computed : ?project:Project.t -> unit -> bool
      module Datatype :
        sig
          type t = Indexed(P)(Info).Dash.Datatype.t
          val ty : t Type.t
          val name : string
          val descr : t Descr.t
          val packed_descr : Structural_descr.pack
          val reprs : t list
          val equal : t -> t -> bool
          val compare : t -> t -> int
          val hash : t -> int
          val pretty_code : Format.formatter -> t -> unit
          val internal_pretty_code :
            Type.precedence -> Format.formatter -> t -> unit
          val pretty : Format.formatter -> t -> unit
          val varname : t -> string
          val mem_project : (Project_skeleton.t -> bool) -> t -> bool
          val copy : t -> t
        end
      val howto_marshal : (Datatype.t -> 'a) -> ('-> Datatype.t) -> unit
      type key = Dashtbl.Default_key_marshaler(P).t
      type data = Dashtbl.Default_data_marshaler(Datatype.Unit).t
      val add : string -> key -> State.t list -> data -> unit
      val replace :
        reset:bool -> string -> key -> State.t list -> data -> unit
      val memo :
        reset:bool ->
        (data list -> data) -> string -> key -> State.t list -> data
      val clear : reset:bool -> unit -> unit
      val remove : reset:bool -> key -> State.t -> unit
      val remove_all : reset:bool -> key -> unit
      val filter :
        reset:bool -> (key -> State.t option -> data -> bool) -> key -> unit
      val mem : key -> bool
      val is_local : State.t -> bool
      val find : ?who:State.t list -> key -> State.t -> data * State.t
      val find_key : State.t -> (key * State.t) list
      val find_data : ?who:State.t list -> key -> State.t -> data
      val find_state : ?who:State.t list -> key -> State.t -> State.t
      val find_all_local :
        ?who:State.t list -> key -> State.t -> (data * State.t) list
      val find_all_local_data :
        ?who:State.t list -> key -> State.t -> data list
      val find_all_local_states :
        ?who:State.t list -> key -> State.t -> State.t list
      val find_all : ?who:State.t list -> key -> (data * State.t) list
      val find_all_data : ?who:State.t list -> key -> data list
      val find_all_states : ?who:State.t list -> key -> State.t list
      val iter : (key -> State.t option -> data * State.t -> unit) -> unit
      val iter_key :
        (State.t option -> data * State.t -> unit) -> key -> unit
      val fold :
        (key -> State.t option -> data * State.t -> '-> 'a) -> '-> 'a
      val fold_key :
        (State.t option -> data * State.t -> '-> 'a) -> key -> '-> 'a
      val length : unit -> int
      module Graph :
        sig
          val create_and_add_state :
            clear:(Project.t -> unit) ->
            name:string -> deps:State.t list -> State.t
          val add_state : State.t -> unit
          val remove_state : reset:bool -> State.t -> unit
          val self : State.t ref
          val internal_kind : State.kind
        end
    end
  module Proxy :
    sig
      val set :
        Property.t -> Property.t list -> Cil_types.annotation_status -> unit
      val update :
        Property.t ->
        Property.t list ->
        (Cil_types.annotation_status -> Cil_types.annotation_status) ->
        Cil_types.annotation_status
    end
  val set_proxy : Info.key -> State.t -> unit
  val state : key -> State.t
  val property : key -> Property.identified_property
end