From e7419b79fdb1fff8281344f148a4b28793c1b408 Mon Sep 17 00:00:00 2001 From: Hans Svensson Date: Tue, 28 May 2019 09:56:38 +0200 Subject: [PATCH] Put state and event types at the top level --- src/aeso_aci.erl | 39 ++++++++++++++++++++++++++++++--------- test/aeso_aci_tests.erl | 22 +++++++++++++++++++--- 2 files changed, 49 insertions(+), 12 deletions(-) diff --git a/src/aeso_aci.erl b/src/aeso_aci.erl index dafdce2..d03baed 100644 --- a/src/aeso_aci.erl +++ b/src/aeso_aci.erl @@ -50,14 +50,29 @@ join_errors(Prefix, Errors, Pfun) -> list_to_binary(string:join([Prefix|Ess], "\n")). encode_contract(Contract) -> - Cname = contract_name(Contract), - Tdefs = [ encode_typedef(T) || - T <- sort_decls(contract_types(Contract)) ], - Fdefs = [ encode_function(F) - || F <- sort_decls(contract_funcs(Contract)), + Cname = contract_name(Contract), + + Tdefs0 = [ encode_typedef(T) + || T <- sort_decls(contract_types(Contract)) ], + Tdefs = [ T || T = #{<<"name">> := N} <- Tdefs0, + N /= <<"state">>, N /= <<"event">> ], + StateT = case [ T || T = #{<<"name">> := N} <- Tdefs0, N == <<"state">> ] of + [#{<<"typedef">> := ST}] -> ST; + [] -> #{<<"tuple">> => []} + end, + EventT = case [ T || T = #{<<"name">> := N} <- Tdefs0, N == <<"event">> ] of + [#{<<"typedef">> := ET}] -> ET; + [] -> #{<<"variant">> => [#{<<"NoEventsDefined">> => []}]} + end, + + Fdefs = [ encode_function(F) + || F <- sort_decls(contract_funcs(Contract)), not is_private(F) ], + #{<<"contract">> => #{<<"name">> => encode_name(Cname), <<"type_defs">> => Tdefs, + <<"state">> => StateT, + <<"event">> => EventT, <<"functions">> => Fdefs}}. %% Encode a function definition. Currently we are only interested in @@ -177,9 +192,12 @@ decode(Json) -> decode_contract(#{<<"name">> := Name, <<"type_defs">> := Ts, + <<"event">> := E, + <<"state">> := S, <<"functions">> := Fs}) -> + MkTDef = fun(N, T) -> #{<<"name">> => N, <<"vars">> => [], <<"typedef">> => T} end, ["contract"," ",io_lib:format("~s", [Name])," =\n", - decode_tdefs(Ts), + decode_tdefs([MkTDef(<<"state">>, S), MkTDef(<<"event">>, E) | Ts]), decode_funcs(Fs)]. decode_funcs(Fs) -> [ decode_func(F) || F <- Fs ]. @@ -219,9 +237,12 @@ decode_type(#{<<"function">> := #{<<"arguments">> := Args, <<"returns">> := R}}) [decode_type(#{<<"tuple">> => Args}), " => ", decode_type(R)]; decode_type(Econs) when is_map(Econs) -> %General constructor [{Ec,Ets}] = maps:to_list(Econs), - C = decode_name(Ec), - Ts = decode_types(Ets), - [C,$(,lists:join(",", Ts),$)]; + AppName = decode_name(Ec), + AppArgs = decode_types(Ets), + case AppArgs of + [] -> [AppName]; + _ -> [AppName,$(,lists:join(", ", AppArgs),$)] + end; decode_type(T) -> %Just raw names. decode_name(T). diff --git a/test/aeso_aci_tests.erl b/test/aeso_aci_tests.erl index e5c0453..df0fa0a 100644 --- a/test/aeso_aci_tests.erl +++ b/test/aeso_aci_tests.erl @@ -19,6 +19,8 @@ test_cases(1) -> MapACI = #{<<"contract">> => #{<<"name">> => <<"C">>, <<"type_defs">> => [], + <<"event">> => #{<<"variant">> => [#{<<"NoEventsDefined">> => []}]}, + <<"state">> => #{<<"tuple">> => []}, <<"functions">> => [#{<<"name">> => <<"a">>, <<"arguments">> => @@ -27,6 +29,8 @@ test_cases(1) -> <<"returns">> => <<"int">>, <<"stateful">> => false}]}}, DecACI = <<"contract C =\n" + " type state = ()\n" + " datatype event = NoEventsDefined\n" " function a : (int) => int\n">>, {Contract,MapACI,DecACI}; @@ -40,6 +44,8 @@ test_cases(2) -> [#{<<"name">> => <<"allan">>, <<"typedef">> => <<"int">>, <<"vars">> => []}], + <<"event">> => #{<<"variant">> => [#{<<"NoEventsDefined">> => []}]}, + <<"state">> => #{<<"tuple">> => []}, <<"functions">> => [#{<<"arguments">> => [#{<<"name">> => <<"i">>, @@ -47,10 +53,16 @@ test_cases(2) -> <<"name">> => <<"a">>, <<"returns">> => <<"int">>, <<"stateful">> => false}]}}, - DecACI = <<"contract C =\n type allan = int\n function a : (C.allan) => int\n">>, + DecACI = <<"contract C =\n" + " type state = ()\n" + " datatype event = NoEventsDefined\n" + " type allan = int\n" + " function a : (C.allan) => int\n">>, {Contract,MapACI,DecACI}; test_cases(3) -> Contract = <<"contract C =\n" + " type state = ()\n" + " datatype event = NoEventsDefined\n" " datatype bert('a) = Bin('a)\n" " function a(i : bert(string)) = 1\n">>, MapACI = #{<<"contract">> => @@ -62,6 +74,8 @@ test_cases(3) -> <<"name">> => <<"a">>,<<"returns">> => <<"int">>, <<"stateful">> => false}], <<"name">> => <<"C">>, + <<"event">> => #{<<"variant">> => [#{<<"NoEventsDefined">> => []}]}, + <<"state">> => #{<<"tuple">> => []}, <<"type_defs">> => [#{<<"name">> => <<"bert">>, <<"typedef">> => @@ -69,6 +83,8 @@ test_cases(3) -> [#{<<"Bin">> => [<<"'a">>]}]}, <<"vars">> => [#{<<"name">> => <<"'a">>}]}]}}, DecACI = <<"contract C =\n" + " type state = ()\n" + " datatype event = NoEventsDefined\n" " datatype bert('a) = Bin('a)\n" " function a : (C.bert(string)) => int\n">>, {Contract,MapACI,DecACI}. @@ -85,10 +101,10 @@ aci_test_contract(Name) -> String = aeso_test_utils:read_contract(Name), {ok, JSON} = aeso_aci:encode(String, [{include, {file_system, [aeso_test_utils:contract_path()]}}]), - %% io:format("JSON:\n~s\n", [JSON]), + io:format("JSON:\n~s\n", [JSON]), ContractStub = aeso_aci:decode(JSON), - %% io:format("STUB:\n~s\n", [ContractStub]), + io:format("STUB:\n~s\n", [ContractStub]), check_stub(ContractStub, [{src_file, Name}]), ok.