Skip to content

Commit 6df9eb2

Browse files
authored
fix(compiler): Re-providing types (#1874)
1 parent b90d924 commit 6df9eb2

File tree

4 files changed

+37
-14
lines changed

4 files changed

+37
-14
lines changed

compiler/src/typed/typemod.re

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -652,19 +652,19 @@ let rec type_module = (~toplevel=false, anchor, env, statements) => {
652652
],
653653
);
654654
| PProvideType({name: {txt: IdentName(name)}, alias, loc}) =>
655-
let (type_id, _) = Typetexp.find_type(env, loc, IdentName(name));
656-
switch (alias) {
657-
| Some({txt: IdentName(alias)}) =>
658-
type_export_aliases :=
659-
[
660-
(type_id, PIdent(Ident.create(alias.txt))),
661-
...type_export_aliases^,
662-
]
663-
| Some(_) => failwith("Impossible: invalid alias")
664-
| None => ()
665-
};
666-
let type_ = Env.find_type(type_id, env);
667-
([TSigType(Path.head(type_id), type_, TRecNot), ...sigs], stmts);
655+
let (type_path, type_) =
656+
Typetexp.find_type(env, loc, IdentName(name));
657+
let id =
658+
switch (alias) {
659+
| Some({txt: IdentName(alias)}) =>
660+
let id = Ident.create(alias.txt);
661+
type_export_aliases :=
662+
[(type_path, PIdent(id)), ...type_export_aliases^];
663+
id;
664+
| Some(_) => failwith("Impossible: invalid alias")
665+
| None => Ident.create(Path.last(type_path))
666+
};
667+
([TSigType(id, type_, TRecNot), ...sigs], stmts);
668668
| PProvideModule({name: {txt: IdentName(name)}, alias, loc}) =>
669669
let (mod_path, mod_decl) =
670670
Typetexp.find_module(env, loc, IdentName(name));
@@ -934,7 +934,11 @@ let rec type_module = (~toplevel=false, anchor, env, statements) => {
934934
switch (get_alias(type_export_aliases^, PIdent(id))) {
935935
| None => TSigType(id, resolve_type_decl(decl), rs)
936936
| Some((name, alias)) =>
937-
TSigType(Path.head(alias), resolve_type_decl(decl), rs)
937+
TSigType(
938+
Ident.create(Path.last(alias)),
939+
resolve_type_decl(decl),
940+
rs,
941+
)
938942
}
939943
| TSigValue(id, {val_type, val_kind} as vd) =>
940944
let val_kind =

compiler/test/suites/includes.re

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,4 +164,9 @@ describe("includes", ({test, testSkip}) => {
164164
"brokenIncludes/main",
165165
"./broken.gr\", line 4, characters 8-15",
166166
);
167+
assertRun(
168+
"reprovide_type",
169+
"include \"reprovideType\"; from ReprovideType use { type Type }; print(A)",
170+
"A\n",
171+
);
167172
});
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module ProvideType
2+
3+
provide enum Type {
4+
A,
5+
B,
6+
C,
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module ReprovideType
2+
3+
include "./provideType"
4+
5+
from ProvideType use { type Type }
6+
7+
provide { type Type }

0 commit comments

Comments
 (0)