From 4441f6ff37d2d50be0a45fbc170e6f178ea70b27 Mon Sep 17 00:00:00 2001 From: SpiveeWorks Date: Fri, 24 Jan 2025 18:33:47 +1100 Subject: [PATCH] Also prepare AACI for namespace types --- src/hz.erl | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/hz.erl b/src/hz.erl index 84b1c85..7143e30 100644 --- a/src/hz.erl +++ b/src/hz.erl @@ -1405,10 +1405,7 @@ prepare_contract(File) -> end. prepare_aaci(ACI) -> - % NOTE this will also pick up the main contract; as a result the main - % contract extraction later on shouldn't bother with typedefs. - Contracts = [ContractDef || #{contract := ContractDef} <- ACI], - Types = simplify_contract_types(Contracts, #{}), + Types = lists:foldl(fun prepare_namespace_types/2, #{}, ACI), [{NameBin, SpecDefs}] = [{N, F} @@ -1419,22 +1416,29 @@ prepare_aaci(ACI) -> Specs = simplify_specs(SpecDefs, #{}, Types), {aaci, Name, Specs, Types}. -simplify_contract_types([], Types) -> - Types; -simplify_contract_types([Next | Rest], Types) -> - TypeDefs = maps:get(typedefs, Next), - NameBin = maps:get(name, Next), +prepare_namespace_types(#{namespace := NS}, Types) -> + prepare_namespace_types2(NS, false, Types); +prepare_namespace_types(#{contract := NS}, Types) -> + prepare_namespace_types2(NS, true, Types). + +prepare_namespace_types2(NS, IsContract, Types) -> + TypeDefs = maps:get(typedefs, NS), + NameBin = maps:get(name, NS), Name = binary_to_list(NameBin), - Types2 = maps:put(Name, {[], contract}, Types), - Types3 = case maps:find(state, Next) of + Types2 = case IsContract of + true -> + maps:put(Name, {[], contract}, Types); + false -> + Types + end, + Types3 = case maps:find(state, NS) of {ok, StateDefACI} -> StateDefOpaque = opaque_type([], StateDefACI), maps:put(Name ++ ".state", {[], StateDefOpaque}, Types2); error -> Types2 end, - Types4 = simplify_typedefs(TypeDefs, Types3, Name ++ "."), - simplify_contract_types(Rest, Types4). + simplify_typedefs(TypeDefs, Types3, Name ++ "."). simplify_typedefs([], Types, _NamePrefix) -> Types;