`type field``= Fieldname.t * typ * Annot.Item.t```
`include sig ... end`
`val compare_field : field ‑> field ‑> int`
`type fields``= field list```
`type t````= private` `{`

`fields : fields;` | (** non-static fields *)
`statics : fields;` | (** static fields *)
`supers : Name.t list;` | (** supers *)
`methods : Procname.t list;` | (** methods defined *)
`annots : Annot.Item.t;` | (** annotations *)

`}```

Type for a structured value.

`type lookup``= Name.t ‑> t option```
`val pp_field : InferStdlib.Pp.env ‑> F.formatter ‑> field ‑> unit`
`val pp : InferStdlib.Pp.env ‑> Name.t ‑> F.formatter ‑> t ‑> unit`

Pretty print a struct type.

`val internal_mk_struct : ?⁠default:t ‑> ?⁠fields:fields ‑> ?⁠statics:fields ‑> ?⁠methods:Procname.t list ‑> ?⁠supers:Name.t list ‑> ?⁠annots:Annot.Item.t ‑> unit ‑> t`

Construct a struct_typ, normalizing field types

`val get_extensible_array_element_typ : lookup:lookup ‑> typ ‑> typ option`

the element typ of the final extensible array in the given typ, if any

`val fld_typ : lookup:lookup ‑> default:typ ‑> Fieldname.t ‑> typ ‑> typ`

If a struct type with field f, return the type of f. If not, return the default type if given, otherwise raise an exception

`val get_field_type_and_annotation : lookup:lookup ‑> Fieldname.t ‑> typ ‑> (typ * Annot.Item.t) option`

Return the type of the field `fn` and its annotation, None if `typ` has no field named `fn`