Also prepare AACI for namespace types

This commit is contained in:
SpiveeWorks 2025-01-24 18:33:47 +11:00
parent 04311f9c99
commit 4441f6ff37

View File

@ -1405,10 +1405,7 @@ prepare_contract(File) ->
end. end.
prepare_aaci(ACI) -> prepare_aaci(ACI) ->
% NOTE this will also pick up the main contract; as a result the main Types = lists:foldl(fun prepare_namespace_types/2, #{}, ACI),
% contract extraction later on shouldn't bother with typedefs.
Contracts = [ContractDef || #{contract := ContractDef} <- ACI],
Types = simplify_contract_types(Contracts, #{}),
[{NameBin, SpecDefs}] = [{NameBin, SpecDefs}] =
[{N, F} [{N, F}
@ -1419,22 +1416,29 @@ prepare_aaci(ACI) ->
Specs = simplify_specs(SpecDefs, #{}, Types), Specs = simplify_specs(SpecDefs, #{}, Types),
{aaci, Name, Specs, Types}. {aaci, Name, Specs, Types}.
simplify_contract_types([], Types) -> prepare_namespace_types(#{namespace := NS}, Types) ->
Types; prepare_namespace_types2(NS, false, Types);
simplify_contract_types([Next | Rest], Types) -> prepare_namespace_types(#{contract := NS}, Types) ->
TypeDefs = maps:get(typedefs, Next), prepare_namespace_types2(NS, true, Types).
NameBin = maps:get(name, Next),
prepare_namespace_types2(NS, IsContract, Types) ->
TypeDefs = maps:get(typedefs, NS),
NameBin = maps:get(name, NS),
Name = binary_to_list(NameBin), Name = binary_to_list(NameBin),
Types2 = maps:put(Name, {[], contract}, Types), Types2 = case IsContract of
Types3 = case maps:find(state, Next) of true ->
maps:put(Name, {[], contract}, Types);
false ->
Types
end,
Types3 = case maps:find(state, NS) of
{ok, StateDefACI} -> {ok, StateDefACI} ->
StateDefOpaque = opaque_type([], StateDefACI), StateDefOpaque = opaque_type([], StateDefACI),
maps:put(Name ++ ".state", {[], StateDefOpaque}, Types2); maps:put(Name ++ ".state", {[], StateDefOpaque}, Types2);
error -> error ->
Types2 Types2
end, end,
Types4 = simplify_typedefs(TypeDefs, Types3, Name ++ "."), simplify_typedefs(TypeDefs, Types3, Name ++ ".").
simplify_contract_types(Rest, Types4).
simplify_typedefs([], Types, _NamePrefix) -> simplify_typedefs([], Types, _NamePrefix) ->
Types; Types;