@@ -4,8 +4,8 @@ open Stddiff
44type type_modification = {
55 type_kind : (type_decl_kind , type_kind ) maybe_changed ;
66 type_privacy : (Asttypes .private_flag , type_privacy ) maybe_changed ;
7- type_manifest : type_expr atomic_option ;
8- type_params : (type_expr , type_param ) list_ ;
7+ type_manifest : type_expr Stddiff . atomic_option;
8+ type_params : (type_expr , type_param ) Stddiff . list_;
99}
1010
1111and type_kind =
@@ -14,7 +14,7 @@ and type_kind =
1414 | Atomic_tk of type_decl_kind atomic_modification
1515
1616and label = {
17- label_type : type_expr maybe_changed_atomic ;
17+ label_type : type_expr Stddiff . maybe_changed_atomic;
1818 label_mutable : (Asttypes .mutable_flag , field_mutability ) maybe_changed ;
1919}
2020
@@ -34,9 +34,17 @@ type type_ = {
3434 tdiff : (type_declaration , type_modification ) entry ;
3535}
3636
37- type value = { vname : string ; vdiff : value_description atomic_entry }
38- type class_ = { cname : string ; cdiff : class_declaration atomic_entry }
39- type cltype = { ctname : string ; ctdiff : class_type_declaration atomic_entry }
37+ type value = {
38+ vname : string ;
39+ vdiff : (value_description , type_expr atomic_modification ) entry ;
40+ }
41+
42+ type class_ = { cname : string ; cdiff : class_declaration Stddiff .atomic_entry }
43+
44+ type cltype = {
45+ ctname : string ;
46+ ctdiff : class_type_declaration Stddiff .atomic_entry ;
47+ }
4048
4149type module_ = {
4250 mname : string ;
@@ -112,6 +120,9 @@ let module_type_fallback ~loc ~typing_env ~name ~reference ~current =
112120 | exception Includemod. Error _ ->
113121 Some (Module { mname = name; mdiff = Modified Unsupported })
114122
123+ let expand_alias_types ~typing_env ~type_expr =
124+ Ctype. full_expand ~may_forget_scope: false typing_env type_expr
125+
115126let type_expr ~typing_env ?(ref_params = [] ) ?(cur_params = [] ) reference
116127 current =
117128 let normed_ref, normed_cur =
@@ -122,7 +133,12 @@ let type_expr ~typing_env ?(ref_params = []) ?(cur_params = []) reference
122133 (normed_ref @ [ reference ])
123134 (normed_cur @ [ current ])
124135 then None
125- else Some { reference; current }
136+ else
137+ Some
138+ {
139+ reference = expand_alias_types ~typing_env ~type_expr: reference;
140+ current = expand_alias_types ~typing_env ~type_expr: current;
141+ }
126142
127143let rec type_item ~typing_env ~name ~reference ~current =
128144 match (reference, current) with
@@ -285,28 +301,21 @@ and type_manifest ~typing_env ~ref_params ~cur_params ~reference ~current =
285301 | None -> Same (Some t1)
286302 | Some diff -> Changed (Modified diff))
287303
304+ let value_descripiton ~typing_env reference current =
305+ type_expr ~typing_env reference.val_type current.val_type
306+
288307let value_item ~typing_env ~name ~reference ~current =
289308 match (reference, current) with
290309 | None , None -> None
291310 | Some reference , None ->
292311 Some (Value { vname = name; vdiff = Removed reference })
293312 | None , Some current -> Some (Value { vname = name; vdiff = Added current })
294313 | Some reference , Some current -> (
295- let val_coercion1 () =
296- Includecore. value_descriptions ~loc: current.val_loc typing_env name
297- current reference
298- in
299- let val_coercion2 () =
300- Includecore. value_descriptions ~loc: reference.val_loc typing_env name
301- reference current
302- in
303- match (val_coercion1 () , val_coercion2 () ) with
304- | Tcoerce_none , Tcoerce_none -> None
305- | _ , _ ->
306- Some (Value { vname = name; vdiff = Modified { reference; current } })
307- | exception Includecore. Dont_match _ ->
308- Some (Value { vname = name; vdiff = Modified { reference; current } })
309- )
314+ let val_type_diff = value_descripiton ~typing_env reference current in
315+ match val_type_diff with
316+ | None -> None
317+ | Some type_expr_diff ->
318+ Some (Value { vname = name; vdiff = Modified type_expr_diff }))
310319
311320let class_item ~typing_env ~name ~(reference : class_declaration option )
312321 ~(current : class_declaration option ) =
@@ -354,19 +363,18 @@ let class_type_item ~typing_env ~name
354363 { reference = ref_class_type; current = curr_class_type };
355364 }))
356365
357- let rec items ~reference ~current =
358- let env = Typing_env. for_diff ~reference ~current in
366+ let rec items ~reference ~current ~typing_env =
359367 let ref_items = extract_items reference in
360368 let curr_items = extract_items current in
361369 let diff_item : type a. (a, 'diff) Sig_item_map.diff_item =
362370 fun item_type name reference current ->
363371 match item_type with
364- | Value -> value_item ~typing_env: env ~name ~reference ~current
365- | Module -> module_item ~typing_env: env ~name ~reference ~current
366- | Modtype -> module_type_item ~typing_env: env ~name ~reference ~current
367- | Type -> type_item ~typing_env: env ~name ~reference ~current
368- | Class -> class_item ~typing_env: env ~name ~reference ~current
369- | Classtype -> class_type_item ~typing_env: env ~name ~reference ~current
372+ | Value -> value_item ~typing_env ~name ~reference ~current
373+ | Module -> module_item ~typing_env ~name ~reference ~current
374+ | Modtype -> module_type_item ~typing_env ~name ~reference ~current
375+ | Type -> type_item ~typing_env ~name ~reference ~current
376+ | Class -> class_item ~typing_env ~name ~reference ~current
377+ | Classtype -> class_type_item ~typing_env ~name ~reference ~current
370378 in
371379 Sig_item_map. diff ~diff_item: { diff_item } ref_items curr_items
372380
@@ -407,20 +415,25 @@ and module_type ~typing_env ~name ~ref_module_type ~current_module_type
407415 ~reference_location =
408416 match (ref_module_type, current_module_type) with
409417 | Mty_signature ref_submod , Mty_signature curr_submod ->
410- signatures ~typing_env ~ reference: ref_submod ~current: curr_submod
418+ signatures ~reference: ref_submod ~current: curr_submod
411419 |> Option. map (fun mdiff -> Module { mname = name; mdiff })
412420 | ref_modtype , curr_modtype ->
413421 module_type_fallback ~loc: reference_location ~typing_env ~name
414422 ~reference: ref_modtype ~current: curr_modtype
415423
416- and signatures ~typing_env ~reference ~current =
417- match items ~reference ~current with
424+ and signatures ~reference ~current =
425+ let modified_reference, modified_current, typing_env =
426+ Typing_env. for_diff ~reference ~current
427+ in
428+ match
429+ items ~reference: modified_reference ~current: modified_current ~typing_env
430+ with
418431 | [] -> (
419432 let coercion1 () =
420- Includemod. signatures typing_env ~mark: Mark_both reference current
433+ Includemod. signatures Env. empty ~mark: Mark_both reference current
421434 in
422435 let coercion2 () =
423- Includemod. signatures typing_env ~mark: Mark_both current reference
436+ Includemod. signatures Env. empty ~mark: Mark_both current reference
424437 in
425438 match (coercion1 () , coercion2 () ) with
426439 | Tcoerce_none , Tcoerce_none -> None
@@ -429,8 +442,7 @@ and signatures ~typing_env ~reference ~current =
429442 | item_changes -> Some (Modified (Supported item_changes))
430443
431444let interface ~module_name ~reference ~current =
432- let typing_env = Env. empty in
433- let sig_out = signatures ~typing_env ~reference ~current in
445+ let sig_out = signatures ~reference ~current in
434446 Option. map (fun mdiff -> { mname = module_name; mdiff }) sig_out
435447
436448let library ~reference ~current =
0 commit comments