Skip to content

Commit d3fe4e0

Browse files
committed
MissingTyVar works
1 parent 6ff4baa commit d3fe4e0

File tree

1 file changed

+32
-11
lines changed

1 file changed

+32
-11
lines changed

experimental/prolog/lb-compiler/kind_check.pl

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -122,13 +122,8 @@
122122
ctx(ctx(ModuleName, TyName, _Sol, Args), arg(TyVar),K) :-
123123
print_message(informational, ctx(arg(TyVar.var_name.name), ModuleName-TyName-K)),
124124
(
125-
first(_{
126-
arg_name: _{name: TyVar.var_name.name, source_info: _},
127-
arg_kind: K
128-
},
129-
Args
130-
) -> true;
131-
throw(error(missing_ty_var(ModuleName, TyName,TyVar,Args)))
125+
find_arg(Args, TyVar, K) -> true;
126+
throw(error(missing_ty_var(ModuleName, TyName, TyVar, Args)))
132127
).
133128

134129
ctx(ctx(ModuleName, TyName, Sol, _Args), ref(TyRef), K) :-
@@ -147,6 +142,10 @@
147142
throw(error(missing_ty_ref(ModuleName, TyName, TyRef, Sol)))
148143
).
149144

145+
find_arg([Arg|Args], TyVar, K) :-
146+
Arg.arg_name.name = TyVar.var_name.name -> K = Arg.arg_kind;
147+
find_arg(Args, TyVar, K).
148+
150149
find_sol([Mn-Tn-K_|Sol], ModuleName, TyName, K) :-
151150
pretty_module_name(ModuleName, ModuleName_),
152151
pretty_module_name(Mn, Mn_),
@@ -179,7 +178,8 @@
179178
KArg=TyArg.arg_kind
180179
),
181180
KArgs),
182-
kind_check_ty(ctx(Mn, Tn, Rs, [TyArg|As]), TyBody, KBody),
181+
append(TyArgs, As, As_),
182+
kind_check_ty(ctx(Mn, Tn, Rs, As_), TyBody, KBody),
183183
kind_arrow_(KArgs, KBody, K).
184184

185185
kind_check_ty(_Ctx, '.lambdabuffers.compiler.TyBody'{opaque: _}, K) :-
@@ -405,12 +405,12 @@
405405
ty_local_ref_("Int", IntTyRef),
406406
ty_def_opaque("String", StringTyDef),
407407
ty_local_ref_("String", StringTyRef),
408-
ty_var("f", TyVarF1),
409-
ty_app(TyVarF1, [IntTyRef, StringTyRef], TyApp),
408+
ty_var("f", TyVarF),
409+
ty_app(TyVarF, [IntTyRef, StringTyRef], TyApp),
410410
ntuple([TyApp], MkAProd),
411411
constr("MkA", MkAProd, MkAConstr),
412412
sum([MkAConstr], FooTyBody),
413-
ty_arg("f1", KF1, TyArg),
413+
ty_arg("f", KF, TyArg),
414414
ty_abs([TyArg], FooTyBody, FooAbs),
415415
ty_def_abs("Foo", FooAbs, FooTyDef),
416416
mod("Mod", [FooTyDef, StringTyDef, IntTyDef], Mod),
@@ -437,6 +437,20 @@
437437
"ModBar"-"Bar"-(*)
438438
]).
439439

440+
test("\nmodule Mod\nsum Foo a = MkA b", [ ]) :-
441+
ty_var("b", TyVarB),
442+
ntuple([TyVarB], MkAProd), constr("MkA", MkAProd, MkAConstr),
443+
sum([MkAConstr], FooTyBody),
444+
kind_ref(type, KStar),
445+
ty_arg("a", KStar, TyArgA),
446+
ty_abs([TyArgA], FooTyBody, FooAbs),
447+
ty_def_abs("Foo", FooAbs, FooTyDef),
448+
mod("Mod", [FooTyDef], Mod),
449+
comp_input([Mod], CompIn),
450+
catch(
451+
kind_check(CompIn, _Solution),
452+
error(missing_ty_var(_, _, TyV, _)),
453+
TyV.var_name.name = "b").
440454

441455
:- end_tests(kind_check).
442456

@@ -461,6 +475,13 @@
461475
]
462476
].
463477

478+
prolog:message(missing_ty_var(ModuleName, TyName, TyVar, _Args))
479+
--> {pretty_module_name(ModuleName, Mn)},[
480+
'Error while kind checking type ~w.~w: Missing type variable ~w '-[
481+
Mn, TyName.name, TyVar.var_name.name
482+
]
483+
].
484+
464485
prolog:message(ctx(Q, ModuleName-TyName-Kind))
465486
--> { pretty_module_name(ModuleName, Mn), pretty_kind(Kind, K) },
466487
['Context ~w.~w :: ~w was queried with ~w'-[

0 commit comments

Comments
 (0)