sig
  type class_data = {
    known : StringModules.StringSet.t;
    classes : Ast.class_def StringModules.lookup_map;
    parents : string StringModules.lookup_map;
    children : string list StringModules.lookup_map;
    variables : (Ast.class_section * string) StringModules.lookup_table;
    methods : Ast.func_def list StringModules.lookup_table;
    refines : Ast.func_def list StringModules.lookup_table;
    mains : Ast.func_def StringModules.lookup_map;
    ancestors : string list StringModules.lookup_map;
    distance : int StringModules.lookup_table;
    refinable : Ast.func_def list StringModules.lookup_table;
  }
  type class_data_error =
      HierarchyIssue of string
    | DuplicateClasses of string list
    | DuplicateVariables of (string * string list) list
    | DuplicateFields of (string * (string * string) list) list
    | UnknownTypes of (string * (string * string) list) list
    | ConflictingMethods of (string * (string * string list) list) list
    | ConflictingInherited of (string * (string * string list) list) list
    | PoorlyTypedSigs of
        (string * (string * string option * (string * string) list) list)
        list
    | Uninstantiable of string list
    | ConflictingRefinements of (string * (string * string list) list) list
    | MultipleMains of string list
end