1- module H = Hashtbl. Make ( Odoc_model.Paths. Identifier )
1+ let get_key ( id : Odoc_model.Paths.Identifier.t ) = id.ikey
22
3- type t = internal_item H .t
4- and internal_item = { direct : int ; indirect : int ; sub : t }
5- type key = Odoc_model.Paths.Identifier .t
3+ module H = Hashtbl. Make (String )
64
7- type item = { direct : int ; indirect : int }
5+ type impl_src = {filepath : string list ; line_number : int }
6+ type t = item H .t
7+ and item = { direct : int ; indirect : int ; impl_src : impl_src option }
8+ type key = string
9+ type identifier = Odoc_model.Paths.Identifier .t
810
9- let internal_to_item : internal_item -> item =
10- fun { direct; indirect; _ } -> { direct; indirect }
11-
12- let v_item () = { direct = 0 ; indirect = 0 ; sub = H. create 0 }
11+ let v_item () = { direct = 0 ; indirect = 0 ; impl_src = None }
1312
1413let v () = H. create 0
1514
16- let add ?(quantity = 1 ) tbl id =
15+ let add ?(quantity = 1 ) tbl id impl_src =
1716 let rec add ?(kind = `Indirect ) id =
18- let incr htbl id =
19- let { direct; indirect; sub } =
20- try H. find htbl id with Not_found -> v_item ()
17+ let incr id =
18+ let { direct; indirect ; impl_src = impl_src_old } =
19+ try H. find tbl (get_key id) with Not_found -> v_item ()
2120 in
21+ let impl_src =
22+ if Option. is_none impl_src || kind <> `Direct
23+ then impl_src_old
24+ else impl_src in
2225 let direct, indirect =
2326 match kind with
2427 | `Direct -> (direct + quantity, indirect)
2528 | `Indirect -> (direct, indirect + quantity)
2629 in
27- H. replace htbl id { direct; indirect; sub };
28- sub
30+ H. replace tbl (get_key id) { direct; indirect ; impl_src };
2931 in
3032 let do_ parent =
31- let htbl = add (parent :> key ) in
32- incr htbl id
33+ add (parent :> identifier );
34+ incr id
3335 in
3436 match id.iv with
3537 | `InstanceVariable (parent , _ ) -> do_ parent
@@ -38,6 +40,7 @@ let add ?(quantity = 1) tbl id =
3840 | `ModuleType (parent , _ ) -> do_ parent
3941 | `Method (parent , _ ) -> do_ parent
4042 | `Field (parent , _ ) -> do_ parent
43+ | `UnboxedField (parent , _ ) -> do_ parent
4144 | `Extension (parent , _ ) -> do_ parent
4245 | `Type (parent , _ ) -> do_ parent
4346 | `Constructor (parent , _ ) -> do_ parent
@@ -46,49 +49,43 @@ let add ?(quantity = 1) tbl id =
4649 | `Class (parent , _ ) -> do_ parent
4750 | `Value (parent , _ ) -> do_ parent
4851 | `ClassType (parent , _ ) -> do_ parent
49- | `Root _ -> incr tbl id
52+ | `Root _ -> incr id
5053 | `SourcePage _ | `Page _ | `LeafPage _ | `SourceLocation _ | `Label _
5154 | `SourceLocationMod _ | `Result _ | `AssetFile _
5255 | `SourceLocationInternal _ ->
5356 assert false
5457 in
55- let _htbl = add ~kind: `Direct id in
56- ()
58+ add ~kind: `Direct id
5759
58- let rec get t id =
59- let do_ parent =
60- get t (parent :> key ) |> function
61- | None -> None
62- | Some { sub; _ } -> ( try Some (H. find sub id) with Not_found -> None )
63- in
64- match id.iv with
65- | `InstanceVariable (parent , _ ) -> do_ parent
66- | `Parameter (parent , _ ) -> do_ parent
67- | `Module (parent , _ ) -> do_ parent
68- | `ModuleType (parent , _ ) -> do_ parent
69- | `Method (parent , _ ) -> do_ parent
70- | `Field (parent , _ ) -> do_ parent
71- | `Extension (parent , _ ) -> do_ parent
72- | `ExtensionDecl (parent , _ , _ ) -> do_ parent
73- | `Type (parent , _ ) -> do_ parent
74- | `Constructor (parent , _ ) -> do_ parent
75- | `Exception (parent , _ ) -> do_ parent
76- | `Class (parent , _ ) -> do_ parent
77- | `Value (parent , _ ) -> do_ parent
78- | `ClassType (parent , _ ) -> do_ parent
79- | `Root _ -> ( try Some (H. find t id) with Not_found -> None )
80- | `SourcePage _ | `Page _ | `LeafPage _ | `SourceLocation _ | `Label _
81- | `SourceLocationMod _ | `Result _ | `AssetFile _ | `SourceLocationInternal _
82- ->
83- None
60+ let add_entries item item_opt =
61+ match item_opt with
62+ | Some { direct; indirect ; impl_src } ->
63+ let direct = item.direct + direct in
64+ let indirect = item.indirect + indirect in
65+ let impl_src = if Option. is_some item.impl_src then item.impl_src else impl_src in
66+ {direct ; indirect ; impl_src}
67+ | None -> item
68+
69+ let get t id = H. find_opt t (get_key id)
70+
71+ let iter = H. iter
72+
73+ let merge_into ~src ~dst =
74+ iter (fun key item ->
75+ let dst_item = H. find_opt dst key in
76+ let new_item = add_entries item dst_item in
77+ H. replace dst key new_item
78+ ) src
79+
80+ module Deftbl = struct
81+ type key = Odoc_model.Paths.Identifier.SourceLocation .t
82+ type item = impl_src
83+ module H = Hashtbl .Make (String )
84+ type t = item H .t
85+
86+ let v () = H. create 0
8487
85- let get t id =
86- match get t id with None -> None | Some i -> Some (internal_to_item i)
88+ let add t (k : key ) (v : item ) = H. add t k.ikey v
8789
88- let rec iter f tbl =
89- H. iter
90- (fun id v ->
91- iter f v.sub;
92- let v = internal_to_item v in
93- f id v)
94- tbl
90+ let get t (k : key ) = H. find_opt t k.ikey
91+ end
0 commit comments