Module Pulselib.PulseTransitiveInfo

module DirectCallee : sig ... end
module Callees : sig ... end

for each call site, we remember which resolution was performed

type t = {
  1. accesses : PulseTrace.Set.t;
    (*

    record specific accesses inter-procedurally

    *)
  2. callees : Callees.t;
    (*

    record all call resolutions that were transitively performed

    *)
  3. direct_callees : DirectCallee.Set.t;
    (*

    record direct callee with specialization key

    *)
  4. direct_missed_captures : IR.Typ.Name.Set.t;
    (*

    record types that were missing during name resolution (fields/methods) while analysing this function (ignoring what happened in callees)

    *)
  5. has_transitive_missed_captures : Absint.AbstractDomain.BooleanOr.t;
    (*

    true iff one the callees of this function has at least one transitively missing type. This does not take into account the local direct_missed_captures set above.

    *)
}
include Ppx_compare_lib.Comparable.S with type t := t
val compare : t Base__Ppx_compare_lib.compare
include Ppx_compare_lib.Equal.S with type t := t
val equal : t Base__Ppx_compare_lib.equal
include Absint.AbstractDomain.WithBottom with type t := t
include Absint.AbstractDomain.S with type t := t
include Absint.AbstractDomain.Comparable with type t := t
include IStdlib.PrettyPrintable.PrintableType with type t := t
val pp : IStdlib.PrettyPrintable.F.formatter -> t -> unit
val leq : lhs:t -> rhs:t -> bool

the implication relation: lhs <= rhs means lhs |- rhs

val join : t -> t -> t
val widen : prev:t -> next:t -> num_iters:int -> t
val bottom : t

The bottom value of the domain.

val is_bottom : t -> bool

Return true if this is the bottom value

val apply_summary : callee_pname:IR.Procname.t -> call_loc:IBase.Location.t -> summary:t -> t -> t
val add_specialized_direct_callee : IR.Procname.t -> IR.Specialization.Pulse.t -> IBase.Location.t -> t -> t
val remember_dropped_elements : dropped:t -> t -> t