Polymorphism support #848
@ -1107,6 +1107,8 @@ check_typedef_sccs(Env, TypeMap, [{acyclic, Name} | SCCs], Acc) ->
|
|||||||
type_error({empty_record_definition, Ann, Name}),
|
type_error({empty_record_definition, Ann, Name}),
|
||||||
check_typedef_sccs(Env1, TypeMap, SCCs, Acc1);
|
check_typedef_sccs(Env1, TypeMap, SCCs, Acc1);
|
||||||
{record_t, Fields} ->
|
{record_t, Fields} ->
|
||||||
|
ets_insert(type_vars_variance, {Env#env.namespace ++ qname(D),
|
||||||
|
infer_type_vars_variance(Xs, Fields)}),
|
||||||
%% check_type to get qualified name
|
%% check_type to get qualified name
|
||||||
RecTy = check_type(Env1, app_t(Ann, D, Xs)),
|
RecTy = check_type(Env1, app_t(Ann, D, Xs)),
|
||||||
Env2 = check_fields(Env1, TypeMap, RecTy, Fields),
|
Env2 = check_fields(Env1, TypeMap, RecTy, Fields),
|
||||||
@ -1141,7 +1143,7 @@ check_typedef(Env, {variant_t, Cons}) ->
|
|||||||
|
|
||||||
infer_type_vars_variance(TypeParams, Cons) ->
|
infer_type_vars_variance(TypeParams, Cons) ->
|
||||||
% args from all type constructors
|
% args from all type constructors
|
||||||
FlatArgs = lists:flatten([Args || {constr_t, _, _, Args} <- Cons]),
|
FlatArgs = lists:flatten([Args || {constr_t, _, _, Args} <- Cons]) ++ [Type || {field_t, _, _, Type} <- Cons],
|
||||||
|
|
||||||
Vs = lists:flatten([element(1, infer_type_vars_variance(Arg)) || Arg <- FlatArgs]),
|
Vs = lists:flatten([element(1, infer_type_vars_variance(Arg)) || Arg <- FlatArgs]),
|
||||||
lists:map(fun({tvar, _, TVar}) ->
|
lists:map(fun({tvar, _, TVar}) ->
|
||||||
@ -1188,7 +1190,7 @@ infer_type_vars_variance({fun_t, _, [], [{tvar, _, TVar}], Res}) ->
|
|||||||
1 -> {TVar, contravariant}
|
1 -> {TVar, contravariant}
|
||||||
end,
|
end,
|
||||||
{[Cur | TVVs], Depth + 1};
|
{[Cur | TVVs], Depth + 1};
|
||||||
infer_type_vars_variance({fun_t, _, [], [_Arg], Res}) ->
|
infer_type_vars_variance({fun_t, _, [], _, Res}) ->
|
||||||
{X, Depth} = infer_type_vars_variance(Res),
|
{X, Depth} = infer_type_vars_variance(Res),
|
||||||
{X, Depth + 1};
|
{X, Depth + 1};
|
||||||
infer_type_vars_variance({tvar, _, TVar}) ->
|
infer_type_vars_variance({tvar, _, TVar}) ->
|
||||||
|
@ -990,6 +990,22 @@ failing_contracts() ->
|
|||||||
"Cannot unify `Animal` and `Cat`\n"
|
"Cannot unify `Animal` and `Cat`\n"
|
||||||
"when checking the type of the expression `TK(f_a_to_c_to_u) : tk(Animal, Cat)` against the expected type `tk(Cat, Cat)`">>
|
"when checking the type of the expression `TK(f_a_to_c_to_u) : tk(Animal, Cat)` against the expected type `tk(Cat, Cat)`">>
|
||||||
])
|
])
|
||||||
|
, ?TYPE_ERROR(polymorphism_variance_switching_records,
|
||||||
|
[<<?Pos(26,13)
|
||||||
|
"Cannot unify `Animal` and `Cat`\n"
|
||||||
|
"when checking the type of the pattern `r03 : rec_a(Cat)` against the expected type `Main.rec_a(Animal)`">>,
|
||||||
|
<<?Pos(32,13)
|
||||||
|
"Cannot unify `Cat` and `Animal`\n"
|
||||||
|
"when checking the type of the pattern `r06 : rec_b(Animal)` against the expected type `Main.rec_b(Cat)`">>,
|
||||||
|
<<?Pos(40,13)
|
||||||
|
"Cannot unify `Animal` and `Cat`\n"
|
||||||
|
"when checking the type of the pattern `r11 : rec_c(Cat)` against the expected type `Main.rec_c(Animal)`">>,
|
||||||
|
<<?Pos(46,13)
|
||||||
|
"Cannot unify `Cat` and `Animal`\n"
|
||||||
|
"when checking the type of the pattern `r16 : rec_d(Animal)` against the expected type `Main.rec_d(Cat)`">>,
|
||||||
|
<<?Pos(47,13)
|
||||||
|
"Cannot unify `Animal` and `Cat`\n"
|
||||||
|
"when checking the type of the pattern `r17 : rec_d(Cat)` against the expected type `Main.rec_d(Animal)`">>])
|
||||||
].
|
].
|
||||||
|
|
||||||
-define(Path(File), "code_errors/" ??File).
|
-define(Path(File), "code_errors/" ??File).
|
||||||
|
Loading…
x
Reference in New Issue
Block a user