@@ -22,14 +22,109 @@ let fold_dirs ~dirs ~f ~init =
22
22
23
23
module H = Hashtbl. Make (Odoc_model.Paths. Identifier )
24
24
25
+ module Occtbl : sig
26
+ type item = { direct : int ; indirect : int ; sub : item H .t }
27
+ type t = item H .t
28
+ type key = Odoc_model.Paths.Identifier .t
29
+ val v : unit -> t
30
+
31
+ val add : t -> key -> unit
32
+
33
+ val iter : (key -> item -> unit ) -> t -> unit
34
+
35
+ val get : t -> key -> item option
36
+ end = struct
37
+ type item = { direct : int ; indirect : int ; sub : item H .t }
38
+ type t = item H .t
39
+ type key = Odoc_model.Paths.Identifier .t
40
+
41
+ let v_item () = { direct = 0 ; indirect = 0 ; sub = H. create 0 }
42
+
43
+ let v () = H. create 0
44
+
45
+ let add tbl id =
46
+ let rec add ?(kind = `Indirect ) id =
47
+ let incr htbl id =
48
+ let { direct; indirect; sub } =
49
+ match H. find_opt htbl id with Some n -> n | None -> v_item ()
50
+ in
51
+ let direct, indirect =
52
+ match kind with
53
+ | `Direct -> (direct + 1 , indirect)
54
+ | `Indirect -> (direct, indirect + 1 )
55
+ in
56
+ H. replace htbl id { direct; indirect; sub };
57
+ sub
58
+ in
59
+ let do_ parent =
60
+ let htbl = add (parent :> key ) in
61
+ incr htbl id
62
+ in
63
+ match id.iv with
64
+ | `InstanceVariable (parent , _ ) -> do_ parent
65
+ | `Parameter (parent , _ ) -> do_ parent
66
+ | `Module (parent , _ ) -> do_ parent
67
+ | `ModuleType (parent , _ ) -> do_ parent
68
+ | `Method (parent , _ ) -> do_ parent
69
+ | `Field (parent , _ ) -> do_ parent
70
+ | `Extension (parent , _ ) -> do_ parent
71
+ | `Type (parent , _ ) -> do_ parent
72
+ | `CoreType _ -> incr tbl id
73
+ | `Constructor (parent , _ ) -> do_ parent
74
+ | `Exception (parent , _ ) -> do_ parent
75
+ | `ExtensionDecl (parent , _ , _ ) -> do_ parent
76
+ | `Class (parent , _ ) -> do_ parent
77
+ | `Value (parent , _ ) -> do_ parent
78
+ | `ClassType (parent , _ ) -> do_ parent
79
+ | `Root _ -> incr tbl id
80
+ | `SourcePage _ | `Page _ | `LeafPage _ | `SourceLocation _
81
+ | `CoreException _ | `Label _ | `SourceLocationMod _ | `Result _
82
+ | `AssetFile _ | `SourceDir _ | `SourceLocationInternal _ ->
83
+ assert false
84
+ in
85
+ let _htbl = add ~kind: `Direct id in
86
+ ()
87
+
88
+ let rec get t id =
89
+ let ( >> = ) = Option. bind in
90
+ let do_ parent =
91
+ get t (parent :> key ) >> = fun { sub; _ } -> H. find_opt sub id
92
+ in
93
+ match id.iv with
94
+ | `InstanceVariable (parent , _ ) -> do_ parent
95
+ | `Parameter (parent , _ ) -> do_ parent
96
+ | `Module (parent , _ ) -> do_ parent
97
+ | `ModuleType (parent , _ ) -> do_ parent
98
+ | `Method (parent , _ ) -> do_ parent
99
+ | `Field (parent , _ ) -> do_ parent
100
+ | `Extension (parent , _ ) -> do_ parent
101
+ | `ExtensionDecl (parent , _ , _ ) -> do_ parent
102
+ | `Type (parent , _ ) -> do_ parent
103
+ | `Constructor (parent , _ ) -> do_ parent
104
+ | `Exception (parent , _ ) -> do_ parent
105
+ | `Class (parent , _ ) -> do_ parent
106
+ | `Value (parent , _ ) -> do_ parent
107
+ | `ClassType (parent , _ ) -> do_ parent
108
+ | `Root _ -> H. find_opt t id
109
+ | `SourcePage _ | `Page _ | `LeafPage _ | `CoreType _ | `SourceLocation _
110
+ | `CoreException _ | `Label _ | `SourceLocationMod _ | `Result _
111
+ | `AssetFile _ | `SourceDir _ | `SourceLocationInternal _ ->
112
+ assert false
113
+
114
+ let rec iter f tbl =
115
+ H. iter
116
+ (fun id v ->
117
+ iter f v.sub;
118
+ f id v)
119
+ tbl
120
+ end
121
+
25
122
let count ~dst ~warnings_options :_ directories =
26
123
let htbl = H. create 100 in
27
124
let f () (unit : Odoc_model.Lang.Compilation_unit.t ) =
28
125
let incr tbl p p' =
29
126
let id = Odoc_model.Paths.Path.Resolved. (identifier (p :> t )) in
30
- let old_value = match H. find_opt tbl id with Some n -> n | None -> 0 in
31
- if not Odoc_model.Paths.Path. (is_hidden p') then
32
- H. replace tbl id (old_value + 1 )
127
+ if not Odoc_model.Paths.Path. (is_hidden p') then Occtbl. add tbl id
33
128
in
34
129
let () =
35
130
List. iter
0 commit comments