@@ -19,18 +19,30 @@ type type_ = {
1919
2020type module_ = {
2121 mname : string ;
22- mdiff : (module_declaration , module_modification ) t ;
22+ mdiff : (module_declaration , signature_modification ) t ;
2323}
2424
25- and module_modification = Unsupported | Supported of sig_item list
26- and sig_item = Value of value | Module of module_ | Type of type_
25+ and modtype = {
26+ mtname : string ;
27+ mtdiff : (modtype_declaration , signature_modification ) t ;
28+ }
29+
30+ and signature_modification = Unsupported | Supported of sig_item list
31+
32+ and sig_item =
33+ | Value of value
34+ | Module of module_
35+ | Type of type_
36+ | Modtype of modtype
2737
28- type item_type = Value_item | Module_item | Type_item [@@ deriving ord ]
38+ type item_type = Value_item | Module_item | Type_item | Modtype_item
39+ [@@ deriving ord ]
2940
3041type sig_items =
3142 | Val of value_description
3243 | Mod of module_declaration
3344 | Typ of type_declaration * Ident .t
45+ | Modtype of modtype_declaration
3446
3547module Sig_item_map = Map. Make (struct
3648 type t = item_type * string [@@ deriving ord ]
@@ -42,14 +54,16 @@ let extract_items items =
4254 match item with
4355 | Sig_module (id , _ , mod_decl , _ , _ ) ->
4456 Sig_item_map. add (Module_item , Ident. name id) (Mod mod_decl) tbl
57+ | Sig_modtype (id , mtd_decl , _ ) ->
58+ Sig_item_map. add (Modtype_item , Ident. name id) (Modtype mtd_decl) tbl
4559 | Sig_value (id , val_des , _ ) ->
4660 Sig_item_map. add (Value_item , Ident. name id) (Val val_des) tbl
4761 | Sig_type (id , type_decl , _ , _ ) ->
4862 Sig_item_map. add (Type_item , Ident. name id) (Typ (type_decl, id)) tbl
4963 | _ -> tbl)
5064 Sig_item_map. empty items
5165
52- let modtype_item ~loc ~typing_env ~name ~reference ~current =
66+ let module_type_fallback ~loc ~typing_env ~name ~reference ~current =
5367 let modtype_coercion1 () =
5468 Includemod. modtypes ~loc typing_env ~mark: Mark_both reference current
5569 in
@@ -121,7 +135,9 @@ let rec items ~reference ~current =
121135 | Module_item , reference , current ->
122136 module_item ~typing_env: env ~name ~reference ~current
123137 | Type_item , reference , current ->
124- type_item ~typing_env: env ~name ~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 )
125141 ref_items curr_items
126142 |> Sig_item_map. bindings |> List. map snd
127143
@@ -136,13 +152,38 @@ and module_item ~typing_env ~name ~reference ~current =
136152 module_declaration ~typing_env ~name ~reference ~current
137153 | _ -> assert false
138154
155+ and module_type_item ~typing_env ~name ~reference ~current =
156+ match (reference, current) with
157+ | None , None -> None
158+ | None , Some (Modtype curr_mtd ) ->
159+ Some (Modtype { mtname = name; mtdiff = Added curr_mtd })
160+ | Some (Modtype ref_mtd ), None ->
161+ Some (Modtype { mtname = name; mtdiff = Removed ref_mtd })
162+ | Some (Modtype ref_mtd ), Some (Modtype curr_mtd ) ->
163+ modtype_declaration ~typing_env ~name ~reference: ref_mtd ~current: curr_mtd
164+ | _ -> assert false
165+
139166and module_declaration ~typing_env ~name ~reference ~current =
140- match (reference.md_type, current.md_type) with
167+ module_type ~typing_env ~name ~ref_module_type: reference.md_type
168+ ~current_module_type: current.md_type ~reference_location: reference.md_loc
169+
170+ and modtype_declaration ~typing_env ~name ~reference ~current =
171+ match (reference.mtd_type, current.mtd_type) with
172+ | Some ref_sub , Some curr_sub ->
173+ module_type ~typing_env ~name ~ref_module_type: ref_sub
174+ ~current_module_type: curr_sub ~reference_location: reference.mtd_loc
175+ | Some _ , None | None , Some _ ->
176+ Some (Modtype { mtname = name; mtdiff = Modified Unsupported })
177+ | None , None -> None
178+
179+ and module_type ~typing_env ~name ~ref_module_type ~current_module_type
180+ ~reference_location =
181+ match (ref_module_type, current_module_type) with
141182 | Mty_signature ref_submod , Mty_signature curr_submod ->
142183 signatures ~typing_env ~reference: ref_submod ~current: curr_submod
143184 |> Option. map (fun mdiff -> Module { mname = name; mdiff })
144185 | ref_modtype , curr_modtype ->
145- modtype_item ~loc: reference.md_loc ~typing_env ~name
186+ module_type_fallback ~loc: reference_location ~typing_env ~name
146187 ~reference: ref_modtype ~current: curr_modtype
147188
148189and signatures ~typing_env ~reference ~current =
@@ -162,5 +203,5 @@ and signatures ~typing_env ~reference ~current =
162203
163204let interface ~module_name ~reference ~current =
164205 let typing_env = Env. empty in
165- signatures ~typing_env ~reference ~current
166- |> Option. map (fun mdiff -> { mname = module_name; mdiff })
206+ let sig_out = signatures ~typing_env ~reference ~current in
207+ Option. map (fun mdiff -> { mname = module_name; mdiff }) sig_out
0 commit comments