From 97d58fcacdbbd78ed0eab6d580b697a383f87d61 Mon Sep 17 00:00:00 2001 From: Ulf Norell Date: Wed, 4 Sep 2019 11:03:33 +0200 Subject: [PATCH] Nicer error for missing event type --- src/aeso_ast_infer_types.erl | 25 +++++++++++++++---------- test/aeso_compiler_tests.erl | 4 ++++ test/contracts/missing_event_type.aes | 3 +++ 3 files changed, 22 insertions(+), 10 deletions(-) create mode 100644 test/contracts/missing_event_type.aes diff --git a/src/aeso_ast_infer_types.erl b/src/aeso_ast_infer_types.erl index 58c60e3..42888ee 100644 --- a/src/aeso_ast_infer_types.erl +++ b/src/aeso_ast_infer_types.erl @@ -205,18 +205,18 @@ bind_state(Env) -> {S, _} -> {qid, Ann, S}; false -> Unit end, - Event = - case lookup_type(Env, {id, Ann, "event"}) of - {E, _} -> {qid, Ann, E}; - false -> {id, Ann, "event"} %% will cause type error if used(?) - end, Env1 = bind_funs([{"state", State}, {"put", {type_sig, [stateful | Ann], [], [State], Unit}}], Env), - %% We bind Chain.event in a local 'Chain' namespace. - pop_scope( - bind_fun("event", {fun_t, Ann, [], [Event], Unit}, - push_scope(namespace, {con, Ann, "Chain"}, Env1))). + case lookup_type(Env, {id, Ann, "event"}) of + {E, _} -> + %% We bind Chain.event in a local 'Chain' namespace. + Event = {qid, Ann, E}, + pop_scope( + bind_fun("event", {fun_t, Ann, [], [Event], Unit}, + push_scope(namespace, {con, Ann, "Chain"}, Env1))); + false -> Env1 + end. -spec bind_field(name(), field_info(), env()) -> env(). bind_field(X, Info, Env = #env{ fields = Fields }) -> @@ -2112,7 +2112,12 @@ mk_error({cannot_unify, A, B, When}) -> mk_t_err(Pos, Msg, Ctxt); mk_error({unbound_variable, Id}) -> Msg = io_lib:format("Unbound variable ~s at ~s\n", [pp(Id), pp_loc(Id)]), - mk_t_err(pos(Id), Msg); + case Id of + {qid, _, ["Chain", "event"]} -> + Cxt = "Did you forget to define the event type?", + mk_t_err(pos(Id), Msg, Cxt); + _ -> mk_t_err(pos(Id), Msg) + end; mk_error({undefined_field, Id}) -> Msg = io_lib:format("Unbound field ~s at ~s\n", [pp(Id), pp_loc(Id)]), mk_t_err(pos(Id), Msg); diff --git a/test/aeso_compiler_tests.erl b/test/aeso_compiler_tests.erl index 22b5275..cb878a4 100644 --- a/test/aeso_compiler_tests.erl +++ b/test/aeso_compiler_tests.erl @@ -496,6 +496,10 @@ failing_contracts() -> "and cannot be called from the contract code.">>]) , ?TEST(bad_top_level_decl, [<>]) + , ?TEST(missing_event_type, + [<>]) ]. -define(Path(File), "code_errors/" ??File). diff --git a/test/contracts/missing_event_type.aes b/test/contracts/missing_event_type.aes new file mode 100644 index 0000000..8931c5e --- /dev/null +++ b/test/contracts/missing_event_type.aes @@ -0,0 +1,3 @@ +contract MissingEventType = + entrypoint main() = + Chain.event("MAIN")