Skip to content

Commit a2563b1

Browse files
committed
In GenType add support for mutual recursion
Signed-Off-By: Jono Prest <[email protected]>
1 parent 3bdcefc commit a2563b1

File tree

3 files changed

+17
-4
lines changed

3 files changed

+17
-4
lines changed

jscomp/gentype/TranslateSignature.ml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,13 +98,17 @@ and translateSignatureItem ~config ~outputFileRelative ~resolver ~typeEnv
9898
signatureItem : Translation.t =
9999
match signatureItem with
100100
| {Typedtree.sig_desc = Typedtree.Tsig_type (recFlag, typeDeclarations)} ->
101+
let recursive = recFlag = Recursive in
102+
if recursive then
103+
typeDeclarations
104+
|> TranslateTypeDeclarations.addRecursiveTypesToTypEnv ~typeEnv;
101105
{
102106
importTypes = [];
103107
codeItems = [];
104108
typeDeclarations =
105109
typeDeclarations
106110
|> TranslateTypeDeclarations.translateTypeDeclarations ~config
107-
~outputFileRelative ~recursive:(recFlag = Recursive) ~resolver
111+
~outputFileRelative ~recursive ~resolver
108112
~typeEnv;
109113
}
110114
| {Typedtree.sig_desc = Tsig_value valueDescription} ->

jscomp/gentype/TranslateStructure.ml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -260,14 +260,17 @@ and translateStructureItem ~config ~outputFileRelative ~resolver ~typeEnv
260260
(structItem : Typedtree.structure_item) : Translation.t =
261261
match structItem with
262262
| {str_desc = Tstr_type (recFlag, typeDeclarations)} ->
263+
let recursive = recFlag = Recursive in
264+
if recursive then
265+
typeDeclarations
266+
|> TranslateTypeDeclarations.addRecursiveTypesToTypEnv ~typeEnv;
263267
{
264268
importTypes = [];
265269
codeItems = [];
266270
typeDeclarations =
267271
typeDeclarations
268272
|> TranslateTypeDeclarations.translateTypeDeclarations ~config
269-
~outputFileRelative ~recursive:(recFlag = Recursive) ~resolver
270-
~typeEnv;
273+
~outputFileRelative ~recursive ~resolver ~typeEnv;
271274
}
272275
| {str_desc = Tstr_value (_loc, valueBindings)} ->
273276
valueBindings

jscomp/gentype/TranslateTypeDeclarations.ml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,13 +313,19 @@ let hasSomeGADTLeaf constructorDeclarations =
313313
(fun declaration -> declaration.Types.cd_res != None)
314314
constructorDeclarations
315315

316+
let addRecursiveTypesToTypEnv ~typeEnv typeDeclarations =
317+
typeDeclarations
318+
|> List.map (fun ({typ_id} : Typedtree.type_declaration) -> typ_id)
319+
|> List.iter (fun type_id ->
320+
typeEnv |> TypeEnv.newType ~name:(type_id |> Ident.name))
321+
316322
let translateTypeDeclaration ~config ~outputFileRelative ~recursive ~resolver
317323
~typeEnv
318324
({typ_attributes; typ_id; typ_loc; typ_manifest; typ_params; typ_type} :
319325
Typedtree.type_declaration) : CodeItem.typeDeclaration list =
320326
if !Debug.translation then
321327
Log_.item "Translate Type Declaration %s\n" (typ_id |> Ident.name);
322-
if recursive then typeEnv |> TypeEnv.newType ~name:(typ_id |> Ident.name);
328+
323329
let typeName = Ident.name typ_id in
324330
let typeVars =
325331
typ_params

0 commit comments

Comments
 (0)