Populate the tag containment relation

This commit is contained in:
Patrick Walton 2010-09-16 14:20:44 -07:00
parent c4c73e09f1
commit d92e30d773

View file

@ -984,6 +984,42 @@ let check_stmt (cx:Semant.ctxt) : (fn_ctx -> Ast.stmt -> unit) =
in
check_stmt
let create_tag_graph_node (cx:Semant.ctxt) (id:Common.opaque_id) (n:int) =
let tag_info = Hashtbl.find cx.Semant.ctxt_all_tag_info id in
let (_, _, ty_tup) = Hashtbl.find tag_info.Semant.tag_nums n in
let rec add_ty =
function
Ast.TY_tag { Ast.tag_id = id'; Ast.tag_args = tys } ->
let make_graph_node () = {
Semant.tgn_index = None;
Semant.tgn_children = Queue.create ()
} in
let tag_graph_node =
Common.htab_search_or_add cx.Semant.ctxt_tag_containment id
make_graph_node
in
Queue.add id' tag_graph_node.Semant.tgn_children;
Array.iter add_ty tys
| Ast.TY_tup tys -> Array.iter add_ty tys
| Ast.TY_rec ty_rec ->
Array.iter (fun (_, ty) -> add_ty ty) ty_rec
| Ast.TY_fn ty_fn -> add_ty_fn ty_fn
| Ast.TY_vec ty | Ast.TY_chan ty | Ast.TY_port ty | Ast.TY_mutable ty
| Ast.TY_constrained (ty, _) -> add_ty ty
| Ast.TY_obj (_, ty_fns) ->
Hashtbl.iter (fun _ ty_fn -> add_ty_fn ty_fn) ty_fns
| _ -> ()
and add_ty_fn (ty_sig, _) =
let add_slot slot =
match slot.Ast.slot_ty with
None -> ()
| Some ty -> add_ty ty
in
Array.iter add_slot ty_sig.Ast.sig_input_slots;
add_slot ty_sig.Ast.sig_output_slot
in
Array.iter add_ty ty_tup
let process_crate (cx:Semant.ctxt) (crate:Ast.crate) : unit =
let path = Stack.create () in
let fn_ctx_stack = Stack.create () in
@ -1052,6 +1088,7 @@ let process_crate (cx:Semant.ctxt) (crate:Ast.crate) : unit =
Ast.MOD_ITEM_fn _ when
not (Hashtbl.mem cx.Semant.ctxt_required_items item_id) ->
finish_function item_id
| Ast.MOD_ITEM_tag (_, id, n) -> create_tag_graph_node cx id n
| _ -> ()
in