package merlin-lib
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>
Merlin's libraries
Install
dune-project
Dependency
Authors
Maintainers
Sources
merlin-5.6-504.tbz
sha256=82d648a4180d6d5aa3a083218e28bf197f4e9f147884de9302bb6811ad98b77f
sha512=e21c96db754a289462677e6985181902ddd90bab9e9cebbbb739d92d94b5aee7ef7a134da70ae384291d9bfaccfecd26d37b48f8d75c5d36b9eda18f6e5afd3d
doc/src/merlin-lib.analysis/locate_types.ml.html
Source file locate_types.ml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54open Std module Type_tree = struct type type_ref_payload = { path : Path.t; ty : Types.type_expr } type t = type_ref_payload Query_protocol.Locate_types_result.Tree.t end let rec flatten_arrow ret_ty = match Types.get_desc ret_ty with | Tarrow (_, ty1, ty2, _) -> ty1 :: flatten_arrow ty2 | _ -> [ ret_ty ] let rec create_type_tree ty : Type_tree.t option = match Types.get_desc ty with | Tarrow (_, ty1, ty2, _) -> let tys = ty1 :: flatten_arrow ty2 in let children = List.filter_map tys ~f:create_type_tree in Some { data = Arrow; children } | Ttuple tys -> let tys = List.map ~f:snd tys in let children = List.filter_map tys ~f:create_type_tree in Some { data = Tuple; children } | Tconstr (path, arg_tys, abbrev_memo) -> let ty_without_args = Btype.newty2 ~level:Ident.highest_scope (Tconstr (path, [], abbrev_memo)) in let children = List.filter_map arg_tys ~f:create_type_tree in Some { data = Type_ref { path; ty = ty_without_args }; children } | Tlink ty | Tpoly (ty, _) -> create_type_tree ty | Tobject (fields_type, _) -> let rec extract_field_types (ty : Types.type_expr) = match Types.get_desc ty with | Tfield (_, _, ty, rest) -> ty :: extract_field_types rest | _ -> [] in let field_types = List.rev (extract_field_types fields_type) in let children = List.filter_map field_types ~f:create_type_tree in Some { data = Object; children } | Tvariant row_desc -> let fields = Types.row_fields row_desc in let children = List.filter_map fields ~f:(fun (_, row_field) -> match Types.row_field_repr row_field with | Rpresent (Some ty) -> create_type_tree ty | Reither (_, tys, _) -> (* If there are multiple types in [tys], they are types that are meant to unify with each other (it'd be a type error if not, see [Ctype.collapse_conj]). So just using the head of the list seems fine (using the entire list results in types being duplicated). *) List.hd_opt tys |> Option.bind ~f:create_type_tree | Rpresent None | Rabsent -> None) in Some { data = Poly_variant; children } | Tnil | Tvar _ | Tsubst _ | Tunivar _ | Tpackage _ | Tfield _ -> None
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>