@@ -35,31 +35,21 @@ and sig_item =
3535 | Type of type_
3636 | Modtype of modtype
3737
38- type item_type = Value_item | Module_item | Type_item | Modtype_item
39- [@@ deriving ord ]
40-
41- type sig_items =
42- | Val of value_description
43- | Mod of module_declaration
44- | Typ of type_declaration * Ident .t
45- | Modtype of modtype_declaration
46-
47- module Sig_item_map = Map. Make (struct
48- type t = item_type * string [@@ deriving ord ]
49- end )
50-
5138let extract_items items =
5239 List. fold_left
5340 (fun tbl item ->
5441 match item with
5542 | Sig_module (id , _ , mod_decl , _ , _ ) ->
56- Sig_item_map. add (Module_item , Ident. name id) (Mod mod_decl) tbl
43+ Sig_item_map. add ~name: (Ident. name id) Sig_item_map. Module mod_decl
44+ tbl
5745 | Sig_modtype (id , mtd_decl , _ ) ->
58- Sig_item_map. add (Modtype_item , Ident. name id) (Modtype mtd_decl) tbl
46+ Sig_item_map. add ~name: (Ident. name id) Sig_item_map. Modtype mtd_decl
47+ tbl
5948 | Sig_value (id , val_des , _ ) ->
60- Sig_item_map. add ( Value_item , Ident. name id) ( Val val_des) tbl
49+ Sig_item_map. add ~name: ( Ident. name id) Sig_item_map. Value val_des tbl
6150 | Sig_type (id , type_decl , _ , _ ) ->
62- Sig_item_map. add (Type_item , Ident. name id) (Typ (type_decl, id)) tbl
51+ Sig_item_map. add ~name: (Ident. name id) Sig_item_map. Type
52+ (type_decl, id) tbl
6353 | _ -> tbl)
6454 Sig_item_map. empty items
6555
@@ -79,11 +69,11 @@ let module_type_fallback ~loc ~typing_env ~name ~reference ~current =
7969let type_item ~typing_env ~name ~reference ~current =
8070 match (reference, current) with
8171 | None , None -> None
82- | Some (Typ ( reference , _ ) ), None ->
72+ | Some (reference , _ ), None ->
8373 Some (Type { tname = name; tdiff = Removed reference })
84- | None , Some (Typ ( current , _ ) ) ->
74+ | None , Some (current , _ ) ->
8575 Some (Type { tname = name; tdiff = Added current })
86- | Some (Typ ( reference , refId )) , Some (Typ ( current , curId ) ) -> (
76+ | Some (reference , refId ), Some (current , curId ) -> (
8777 let type_coercion1 () =
8878 Includecore. type_declarations ~loc: current.type_loc typing_env
8979 ~mark: false name current (Pident curId) reference
@@ -96,16 +86,14 @@ let type_item ~typing_env ~name ~reference ~current =
9686 | None , None -> None
9787 | _ , _ ->
9888 Some (Type { tname = name; tdiff = Modified { reference; current } }))
99- | _ -> None
10089
10190let value_item ~typing_env ~name ~reference ~current =
10291 match (reference, current) with
10392 | None , None -> None
104- | Some (Val reference ) , None ->
93+ | Some reference , None ->
10594 Some (Value { vname = name; vdiff = Removed reference })
106- | None , Some (Val current ) ->
107- Some (Value { vname = name; vdiff = Added current })
108- | Some (Val reference ), Some (Val current ) -> (
95+ | None , Some current -> Some (Value { vname = name; vdiff = Added current })
96+ | Some reference , Some current -> (
10997 let val_coercion1 () =
11098 Includecore. value_descriptions ~loc: current.val_loc typing_env name
11199 current reference
@@ -121,47 +109,40 @@ let value_item ~typing_env ~name ~reference ~current =
121109 | exception Includecore. Dont_match _ ->
122110 Some (Value { vname = name; vdiff = Modified { reference; current } })
123111 )
124- | _ -> None
125112
126113let rec items ~reference ~current =
127114 let env = Typing_env. for_diff ~reference ~current in
128115 let ref_items = extract_items reference in
129116 let curr_items = extract_items current in
130- Sig_item_map. merge
131- (fun (item_type , name ) ref_opt curr_opt ->
132- match (item_type, ref_opt, curr_opt) with
133- | Value_item , reference , current ->
134- value_item ~typing_env: env ~name ~reference ~current
135- | Module_item , reference , current ->
136- module_item ~typing_env: env ~name ~reference ~current
137- | Type_item , reference , current ->
138- type_item ~typing_env: env ~name ~reference ~current
139- | Modtype_item , reference , current ->
140- module_type_item ~typing_env: env ~name ~reference ~current )
141- ref_items curr_items
142- |> Sig_item_map. bindings |> List. map snd
143-
144- and module_item ~typing_env ~name ~reference ~current =
117+ let diff_item : type a. (a, 'diff) Sig_item_map.diff_item =
118+ fun item_type name reference current ->
119+ match item_type with
120+ | Value -> value_item ~typing_env: env ~name ~reference ~current
121+ | Module -> module_item ~typing_env: env ~name ~reference ~current
122+ | Modtype -> module_type_item ~typing_env: env ~name ~reference ~current
123+ | Type -> type_item ~typing_env: env ~name ~reference ~current
124+ in
125+ Sig_item_map. diff ~diff_item: { diff_item } ref_items curr_items
126+
127+ and module_item ~typing_env ~name ~(reference : module_declaration option )
128+ ~(current : module_declaration option ) =
145129 match (reference, current) with
146130 | None , None -> None
147- | None , Some (Mod curr_md ) ->
148- Some (Module { mname = name; mdiff = Added curr_md })
149- | Some (Mod ref_md ), None ->
150- Some (Module { mname = name; mdiff = Removed ref_md })
151- | Some (Mod reference ), Some (Mod current ) ->
131+ | None , Some curr_md -> Some (Module { mname = name; mdiff = Added curr_md })
132+ | Some ref_md , None -> Some (Module { mname = name; mdiff = Removed ref_md })
133+ | Some reference , Some current ->
152134 module_declaration ~typing_env ~name ~reference ~current
153- | _ -> assert false
154135
155- and module_type_item ~typing_env ~name ~reference ~current =
136+ and module_type_item ~typing_env ~name ~(reference : modtype_declaration option )
137+ ~(current : modtype_declaration option ) =
156138 match (reference, current) with
157139 | None , None -> None
158- | None , Some (Modtype curr_mtd ) ->
140+ | None , Some curr_mtd ->
159141 Some (Modtype { mtname = name; mtdiff = Added curr_mtd })
160- | Some (Modtype ref_mtd ) , None ->
142+ | Some ref_mtd , None ->
161143 Some (Modtype { mtname = name; mtdiff = Removed ref_mtd })
162- | Some (Modtype ref_mtd ) , Some (Modtype curr_mtd ) ->
144+ | Some ref_mtd , Some curr_mtd ->
163145 modtype_declaration ~typing_env ~name ~reference: ref_mtd ~current: curr_mtd
164- | _ -> assert false
165146
166147and module_declaration ~typing_env ~name ~reference ~current =
167148 module_type ~typing_env ~name ~ref_module_type: reference.md_type
0 commit comments