You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
2.1 KiB
73 lines
2.1 KiB
/*
|
|
* vim: set ft=rust:
|
|
* vim: set ft=reason:
|
|
*
|
|
* Copyright (c) 2009 - 2013 Monoidics ltd.
|
|
* Copyright (c) 2013 - present Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*/
|
|
open! IStd;
|
|
|
|
|
|
/** The Smallfoot Intermediate Language: Struct Types */
|
|
let module F = Format;
|
|
|
|
type fields = list (Ident.fieldname, Typ.t, Annot.Item.t);
|
|
|
|
|
|
/** Type for a structured value. */
|
|
type t = private {
|
|
fields: fields, /** non-static fields */
|
|
statics: fields, /** static fields */
|
|
supers: list Typename.t, /** supers */
|
|
methods: list Procname.t, /** methods defined */
|
|
annots: Annot.Item.t /** annotations */
|
|
};
|
|
|
|
type lookup = Typename.t => option t;
|
|
|
|
|
|
/** Comparision for fieldnames * types * item annotations. */
|
|
let compare_fld_typ_ann:
|
|
(Ident.fieldname, Typ.t, Annot.Item.t) => (Ident.fieldname, Typ.t, Annot.Item.t) => int;
|
|
|
|
|
|
/** Pretty print a struct type. */
|
|
let pp: Pp.env => Typename.t => F.formatter => t => unit;
|
|
|
|
|
|
/** Construct a struct_typ, normalizing field types */
|
|
let internal_mk_struct:
|
|
default::t? =>
|
|
fields::fields? =>
|
|
statics::fields? =>
|
|
methods::list Procname.t? =>
|
|
supers::list Typename.t? =>
|
|
annots::Annot.Item.t? =>
|
|
unit =>
|
|
t;
|
|
|
|
|
|
/** the element typ of the final extensible array in the given typ, if any */
|
|
let get_extensible_array_element_typ: lookup::lookup => Typ.t => option Typ.t;
|
|
|
|
|
|
/** If a struct type with field f, return the type of f.
|
|
If not, return the default type if given, otherwise raise an exception */
|
|
let fld_typ: lookup::lookup => default::Typ.t => Ident.fieldname => Typ.t => Typ.t;
|
|
|
|
|
|
/** Return the type of the field [fn] and its annotation, None if [typ] has no field named [fn] */
|
|
let get_field_type_and_annotation:
|
|
lookup::lookup => Ident.fieldname => Typ.t => option (Typ.t, Annot.Item.t);
|
|
|
|
|
|
/** Field used for objective-c reference counting */
|
|
let objc_ref_counter_field: (Ident.fieldname, Typ.t, Annot.Item.t);
|
|
|
|
let is_objc_ref_counter_field: (Ident.fieldname, Typ.t, Annot.Item.t) => bool;
|