|
122 | 122 | ctx(ctx(ModuleName, TyName, _Sol, Args), arg(TyVar),K) :- |
123 | 123 | print_message(informational, ctx(arg(TyVar.var_name.name), ModuleName-TyName-K)), |
124 | 124 | ( |
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))) |
132 | 127 | ). |
133 | 128 |
|
134 | 129 | ctx(ctx(ModuleName, TyName, Sol, _Args), ref(TyRef), K) :- |
|
147 | 142 | throw(error(missing_ty_ref(ModuleName, TyName, TyRef, Sol))) |
148 | 143 | ). |
149 | 144 |
|
| 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 | + |
150 | 149 | find_sol([Mn-Tn-K_|Sol], ModuleName, TyName, K) :- |
151 | 150 | pretty_module_name(ModuleName, ModuleName_), |
152 | 151 | pretty_module_name(Mn, Mn_), |
|
179 | 178 | KArg=TyArg.arg_kind |
180 | 179 | ), |
181 | 180 | 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), |
183 | 183 | kind_arrow_(KArgs, KBody, K). |
184 | 184 |
|
185 | 185 | kind_check_ty(_Ctx, '.lambdabuffers.compiler.TyBody'{opaque: _}, K) :- |
|
405 | 405 | ty_local_ref_("Int", IntTyRef), |
406 | 406 | ty_def_opaque("String", StringTyDef), |
407 | 407 | 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), |
410 | 410 | ntuple([TyApp], MkAProd), |
411 | 411 | constr("MkA", MkAProd, MkAConstr), |
412 | 412 | sum([MkAConstr], FooTyBody), |
413 | | - ty_arg("f1", KF1, TyArg), |
| 413 | + ty_arg("f", KF, TyArg), |
414 | 414 | ty_abs([TyArg], FooTyBody, FooAbs), |
415 | 415 | ty_def_abs("Foo", FooAbs, FooTyDef), |
416 | 416 | mod("Mod", [FooTyDef, StringTyDef, IntTyDef], Mod), |
|
437 | 437 | "ModBar"-"Bar"-(*) |
438 | 438 | ]). |
439 | 439 |
|
| 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"). |
440 | 454 |
|
441 | 455 | :- end_tests(kind_check). |
442 | 456 |
|
|
461 | 475 | ] |
462 | 476 | ]. |
463 | 477 |
|
| 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 | + |
464 | 485 | prolog:message(ctx(Q, ModuleName-TyName-Kind)) |
465 | 486 | --> { pretty_module_name(ModuleName, Mn), pretty_kind(Kind, K) }, |
466 | 487 | ['Context ~w.~w :: ~w was queried with ~w'-[ |
|
0 commit comments