Move freshening functions to aeso_tc_env
This commit is contained in:
parent
ac428d1e36
commit
fa94b96997
@ -51,6 +51,10 @@ set_qname(A, B) -> aeso_tc_name_manip:set_qname(A, B).
|
||||
|
||||
type_error(A) -> aeso_tc_errors:type_error(A).
|
||||
create_type_errors() -> aeso_tc_errors:create_type_errors().
|
||||
|
||||
%% -------
|
||||
|
||||
fresh_uvar(A) -> aeso_tc_env:fresh_uvar(A).
|
||||
destroy_and_report_type_errors(A) -> aeso_tc_env:destroy_and_report_type_errors(A).
|
||||
|
||||
%% -------
|
||||
@ -105,10 +109,6 @@ unfold_record_types(A, B) -> aeso_tc_type_unfolding:unfold_record_types(A, B).
|
||||
|
||||
opposite_variance(A) -> aeso_tc_type_utils:opposite_variance(A).
|
||||
|
||||
%% -------
|
||||
|
||||
fresh_uvar(A) -> aeso_tc_fresh:fresh_uvar(A).
|
||||
|
||||
%% -- The rest ---------------------------------------------------------------
|
||||
|
||||
map_t(As, K, V) -> {app_t, As, {id, As, "map"}, [K, V]}.
|
||||
|
@ -52,10 +52,10 @@ app_t(A, B, C) -> aeso_tc_type_utils:app_t(A, B, C).
|
||||
|
||||
%% -------
|
||||
|
||||
fresh_uvar(A) -> aeso_tc_fresh:fresh_uvar(A).
|
||||
freshen(A) -> aeso_tc_fresh:freshen(A).
|
||||
create_freshen_tvars() -> aeso_tc_fresh:create_freshen_tvars().
|
||||
destroy_freshen_tvars() -> aeso_tc_fresh:destroy_freshen_tvars().
|
||||
fresh_uvar(A) -> aeso_tc_env:fresh_uvar(A).
|
||||
freshen(A) -> aeso_tc_env:freshen(A).
|
||||
create_freshen_tvars() -> aeso_tc_env:create_freshen_tvars().
|
||||
destroy_freshen_tvars() -> aeso_tc_env:destroy_freshen_tvars().
|
||||
|
||||
%% ---------------------------------------------------------------------------
|
||||
|
||||
|
@ -68,6 +68,13 @@
|
||||
, empty_env/0
|
||||
]).
|
||||
|
||||
%% Freshening
|
||||
-export([ fresh_uvar/1
|
||||
, freshen/1
|
||||
, create_freshen_tvars/0
|
||||
, destroy_freshen_tvars/0
|
||||
]).
|
||||
|
||||
-export([destroy_and_report_type_errors/1]).
|
||||
|
||||
-export_type([env/0]).
|
||||
@ -170,12 +177,6 @@ used_constant(A, B) -> aeso_tc_warnings:used_constant(A, B).
|
||||
get_option(A, B) -> aeso_tc_options:get_option(A, B).
|
||||
when_warning(A, B) -> aeso_tc_options:when_warning(A, B).
|
||||
|
||||
%% -------
|
||||
|
||||
fresh_uvar(A) -> aeso_tc_fresh:fresh_uvar(A).
|
||||
freshen_type(A, B) -> aeso_tc_fresh:freshen_type(A, B).
|
||||
freshen_type_sig(A, B) -> aeso_tc_fresh:freshen_type_sig(A, B).
|
||||
|
||||
%% -- Getters ------------------------------------------------------------
|
||||
|
||||
contract_parents(#env{contract_parents = ContractParents}) ->
|
||||
@ -1019,3 +1020,54 @@ unqualify1(NS, Xs) ->
|
||||
_ -> Xs
|
||||
catch _:_ -> Xs
|
||||
end.
|
||||
|
||||
fresh_uvar(Attrs) ->
|
||||
{uvar, Attrs, make_ref()}.
|
||||
|
||||
create_freshen_tvars() ->
|
||||
aeso_tc_ets_manager:ets_new(freshen_tvars, [set]).
|
||||
|
||||
destroy_freshen_tvars() ->
|
||||
aeso_tc_ets_manager:ets_delete(freshen_tvars).
|
||||
|
||||
freshen_type(Ann, Type) ->
|
||||
create_freshen_tvars(),
|
||||
Type1 = freshen(Ann, Type),
|
||||
destroy_freshen_tvars(),
|
||||
Type1.
|
||||
|
||||
freshen(Type) ->
|
||||
freshen(aeso_syntax:get_ann(Type), Type).
|
||||
|
||||
freshen(Ann, {tvar, _, Name}) ->
|
||||
NewT = case aeso_tc_ets_manager:ets_lookup(freshen_tvars, Name) of
|
||||
[] -> fresh_uvar(Ann);
|
||||
[{Name, T}] -> T
|
||||
end,
|
||||
aeso_tc_ets_manager:ets_insert(freshen_tvars, {Name, NewT}),
|
||||
NewT;
|
||||
freshen(Ann, {bytes_t, _, any}) ->
|
||||
X = fresh_uvar(Ann),
|
||||
aeso_tc_constraints:add_is_bytes_constraint(X),
|
||||
X;
|
||||
freshen(Ann, T) when is_tuple(T) ->
|
||||
list_to_tuple(freshen(Ann, tuple_to_list(T)));
|
||||
freshen(Ann, [A | B]) ->
|
||||
[freshen(Ann, A) | freshen(Ann, B)];
|
||||
freshen(_, X) ->
|
||||
X.
|
||||
|
||||
freshen_type_sig(Ann, TypeSig = {type_sig, _, Constr, _, _, _}) ->
|
||||
FunT = freshen_type(Ann, aeso_tc_type_utils:typesig_to_fun_t(TypeSig)),
|
||||
apply_typesig_constraint(Ann, Constr, FunT),
|
||||
FunT.
|
||||
|
||||
apply_typesig_constraint(_Ann, none, _FunT) -> ok;
|
||||
apply_typesig_constraint(Ann, address_to_contract, {fun_t, _, [], [_], Type}) ->
|
||||
aeso_tc_constraints:add_is_contract_constraint(Type, {address_to_contract, Ann});
|
||||
apply_typesig_constraint(Ann, bytes_concat, {fun_t, _, [], [A, B], C}) ->
|
||||
aeso_tc_constraints:add_add_bytes_constraint(Ann, concat, A, B, C);
|
||||
apply_typesig_constraint(Ann, bytes_split, {fun_t, _, [], [C], {tuple_t, _, [A, B]}}) ->
|
||||
aeso_tc_constraints:add_add_bytes_constraint(Ann, split, A, B, C);
|
||||
apply_typesig_constraint(Ann, bytecode_hash, {fun_t, _, _, [Con], _}) ->
|
||||
aeso_tc_constraints:add_is_contract_constraint(Con, {bytecode_hash, Ann}).
|
||||
|
@ -1,60 +0,0 @@
|
||||
-module(aeso_tc_fresh).
|
||||
|
||||
-export([ fresh_uvar/1
|
||||
, freshen/1
|
||||
, create_freshen_tvars/0
|
||||
, destroy_freshen_tvars/0
|
||||
, freshen_type/2
|
||||
, freshen_type_sig/2
|
||||
]).
|
||||
|
||||
fresh_uvar(Attrs) ->
|
||||
{uvar, Attrs, make_ref()}.
|
||||
|
||||
create_freshen_tvars() ->
|
||||
aeso_tc_ets_manager:ets_new(freshen_tvars, [set]).
|
||||
|
||||
destroy_freshen_tvars() ->
|
||||
aeso_tc_ets_manager:ets_delete(freshen_tvars).
|
||||
|
||||
freshen_type(Ann, Type) ->
|
||||
create_freshen_tvars(),
|
||||
Type1 = freshen(Ann, Type),
|
||||
destroy_freshen_tvars(),
|
||||
Type1.
|
||||
|
||||
freshen(Type) ->
|
||||
freshen(aeso_syntax:get_ann(Type), Type).
|
||||
|
||||
freshen(Ann, {tvar, _, Name}) ->
|
||||
NewT = case aeso_tc_ets_manager:ets_lookup(freshen_tvars, Name) of
|
||||
[] -> fresh_uvar(Ann);
|
||||
[{Name, T}] -> T
|
||||
end,
|
||||
aeso_tc_ets_manager:ets_insert(freshen_tvars, {Name, NewT}),
|
||||
NewT;
|
||||
freshen(Ann, {bytes_t, _, any}) ->
|
||||
X = fresh_uvar(Ann),
|
||||
aeso_tc_constraints:add_is_bytes_constraint(X),
|
||||
X;
|
||||
freshen(Ann, T) when is_tuple(T) ->
|
||||
list_to_tuple(freshen(Ann, tuple_to_list(T)));
|
||||
freshen(Ann, [A | B]) ->
|
||||
[freshen(Ann, A) | freshen(Ann, B)];
|
||||
freshen(_, X) ->
|
||||
X.
|
||||
|
||||
freshen_type_sig(Ann, TypeSig = {type_sig, _, Constr, _, _, _}) ->
|
||||
FunT = freshen_type(Ann, aeso_tc_type_utils:typesig_to_fun_t(TypeSig)),
|
||||
apply_typesig_constraint(Ann, Constr, FunT),
|
||||
FunT.
|
||||
|
||||
apply_typesig_constraint(_Ann, none, _FunT) -> ok;
|
||||
apply_typesig_constraint(Ann, address_to_contract, {fun_t, _, [], [_], Type}) ->
|
||||
aeso_tc_constraints:add_is_contract_constraint(Type, {address_to_contract, Ann});
|
||||
apply_typesig_constraint(Ann, bytes_concat, {fun_t, _, [], [A, B], C}) ->
|
||||
aeso_tc_constraints:add_add_bytes_constraint(Ann, concat, A, B, C);
|
||||
apply_typesig_constraint(Ann, bytes_split, {fun_t, _, [], [C], {tuple_t, _, [A, B]}}) ->
|
||||
aeso_tc_constraints:add_add_bytes_constraint(Ann, split, A, B, C);
|
||||
apply_typesig_constraint(Ann, bytecode_hash, {fun_t, _, _, [Con], _}) ->
|
||||
aeso_tc_constraints:add_is_contract_constraint(Con, {bytecode_hash, Ann}).
|
Loading…
x
Reference in New Issue
Block a user