mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-12 09:57:43 +00:00
Populate the tag containment relation
This commit is contained in:
parent
c4c73e09f1
commit
d92e30d773
@ -984,6 +984,42 @@ let check_stmt (cx:Semant.ctxt) : (fn_ctx -> Ast.stmt -> unit) =
|
|||||||
in
|
in
|
||||||
check_stmt
|
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 process_crate (cx:Semant.ctxt) (crate:Ast.crate) : unit =
|
||||||
let path = Stack.create () in
|
let path = Stack.create () in
|
||||||
let fn_ctx_stack = 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
|
Ast.MOD_ITEM_fn _ when
|
||||||
not (Hashtbl.mem cx.Semant.ctxt_required_items item_id) ->
|
not (Hashtbl.mem cx.Semant.ctxt_required_items item_id) ->
|
||||||
finish_function item_id
|
finish_function item_id
|
||||||
|
| Ast.MOD_ITEM_tag (_, id, n) -> create_tag_graph_node cx id n
|
||||||
| _ -> ()
|
| _ -> ()
|
||||||
in
|
in
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user