@@ -2,8 +2,10 @@ open StdLabels
22
33module Type_tree = struct
44 type node_data =
5- | Artificial_node of [ `Arrow | `Tuple ]
6- | Type of { path : Path .t ; ty : Types .type_expr }
5+ | Arrow
6+ | Tuple
7+ | Object
8+ | Type_ref of { path : Path .t ; ty : Types .type_expr }
79
810 type t = { data : node_data ; children : t list }
911end
@@ -18,20 +20,27 @@ let rec create_type_tree ty : Type_tree.t option =
1820 | Tarrow (_ , ty1 , ty2 , _ ) ->
1921 let tys = ty1 :: flatten_arrow ty2 in
2022 let children = List. filter_map tys ~f: create_type_tree in
21- Some { data = Artificial_node ` Arrow ; children }
23+ Some { data = Arrow ; children }
2224 | Ttuple tys | Tunboxed_tuple tys ->
2325 let children =
2426 List. filter_map tys ~f: (fun (_ , ty ) -> create_type_tree ty)
2527 in
26- Some { data = Artificial_node ` Tuple ; children }
28+ Some { data = Tuple ; children }
2729 | Tconstr (path , arg_tys , abbrev_memo ) ->
2830 let ty_without_args =
2931 Types. newty2 ~level: Ident. highest_scope (Tconstr (path, [] , abbrev_memo))
3032 in
3133 let children = List. filter_map arg_tys ~f: create_type_tree in
32- Some { data = Type { path; ty = ty_without_args }; children }
34+ Some { data = Type_ref { path; ty = ty_without_args }; children }
3335 | Tlink ty | Tpoly (ty , _ ) -> create_type_tree ty
34- | Tobject _ | Tfield _ ->
35- (* CR-someday: support objects *)
36+ | Tobject (fields_type , _ ) ->
37+ let rec extract_field_types (ty : Types.type_expr ) =
38+ match Types. get_desc ty with
39+ | Tfield (_ , _ , ty , rest ) -> ty :: extract_field_types rest
40+ | _ -> []
41+ in
42+ let field_types = List. rev (extract_field_types fields_type) in
43+ let children = List. filter_map field_types ~f: create_type_tree in
44+ Some { data = Object ; children }
45+ | Tnil | Tvar _ | Tsubst _ | Tvariant _ | Tunivar _ | Tpackage _ | Tfield _ ->
3646 None
37- | Tnil | Tvar _ | Tsubst _ | Tvariant _ | Tunivar _ | Tpackage _ -> None
0 commit comments