Source file expand_tools.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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
open Odoc_utils.ResultMonad
open Odoc_model
let handle_expansion env id expansion =
let handle_argument parent arg_opt expr env =
match arg_opt with
| Component.FunctorParameter.Unit -> (env, expr)
| Named arg ->
let identifier =
Paths.Identifier.Mk.parameter
(parent, Ident.Name.typed_module arg.Component.FunctorParameter.id)
in
let m = Component.module_of_functor_argument arg in
let env' =
Env.add_module identifier (Component.Delayed.put_val m) m.doc env
in
let rp = `Gpath (`Identifier identifier) in
let p = `Resolved rp in
let subst =
Subst.add_module (arg.id :> Ident.module_) p rp Subst.identity
in
(env', Subst.module_type_expr subst expr)
in
let rec expand id env expansion :
(Env.t * Component.ModuleType.simple_expansion, _) Result.result =
match expansion with
| Tools.Signature sg ->
Ok
( env,
(Component.ModuleType.Signature sg
: Component.ModuleType.simple_expansion) )
| Functor (arg, expr) ->
let env', expr' = handle_argument id arg expr env in
Tools.expansion_of_module_type_expr env' expr' >>= fun res ->
expand (Paths.Identifier.Mk.result id) env res >>= fun (env, res) ->
Ok
( env,
(Component.ModuleType.Functor (arg, res)
: Component.ModuleType.simple_expansion) )
in
expand id env expansion
exception Clash
let rec type_expr map t =
let open Lang.TypeExpr in
match t with
| Var v -> (
try List.assoc v map
with _ ->
Format.eprintf "Failed to list assoc %s\n%!" v;
failwith "bah")
| Any -> Any
| Alias (t, s) ->
if List.mem_assoc s map then raise Clash else Alias (type_expr map t, s)
| Arrow (l, t1, t2) -> Arrow (l, type_expr map t1, type_expr map t2)
| Tuple ts -> Tuple (List.map (type_expr map) ts)
| Constr (p, ts) -> Constr (p, List.map (type_expr map) ts)
| Polymorphic_variant pv -> Polymorphic_variant (polymorphic_variant map pv)
| Object o -> Object (object_ map o)
| Class (path, ts) -> Class (path, List.map (type_expr map) ts)
| Poly (s, t) -> Poly (s, type_expr map t)
| Package p -> Package (package map p)
and polymorphic_variant map pv =
let open Lang.TypeExpr.Polymorphic_variant in
let constructor c =
{
c with
Constructor.arguments = List.map (type_expr map) c.Constructor.arguments;
}
in
let element = function
| Type t -> Type (type_expr map t)
| Constructor c -> Constructor (constructor c)
in
{ kind = pv.kind; elements = List.map element pv.elements }
and object_ map o =
let open Lang.TypeExpr.Object in
let method_ m = { m with type_ = type_expr map m.type_ } in
let field = function
| Method m -> Method (method_ m)
| Inherit t -> Inherit (type_expr map t)
in
{ o with fields = List.map field o.fields }
and package map p =
let open Lang.TypeExpr.Package in
let subst (frag, t) = (frag, type_expr map t) in
{ p with substitutions = List.map subst p.substitutions }
let collapse_eqns eqn1 eqn2 params =
let open Lang.TypeDecl in
let map =
List.map2
(fun v p -> match v.desc with Var x -> Some (x, p) | Any -> None)
eqn2.Equation.params params
in
let map =
List.fold_right
(fun x xs -> match x with Some x -> x :: xs | None -> xs)
map []
in
{
eqn1 with
Equation.manifest =
(match eqn2.manifest with
| None -> None
| Some t -> Some (type_expr map t));
}