diff --git a/src/aeso_ast_infer_types.erl b/src/aeso_ast_infer_types.erl index 58a4050..c15f8ba 100644 --- a/src/aeso_ast_infer_types.erl +++ b/src/aeso_ast_infer_types.erl @@ -566,11 +566,13 @@ infer_constant({letval, Attrs,_Pattern, Type, E}) -> infer_contract(Env, What, Defs) -> Kind = fun({type_def, _, _, _, _}) -> type; ({letfun, _, _, _, _, _}) -> function; - ({fun_decl, _, _, _}) -> prototype + ({fun_decl, _, _, _}) -> prototype; + (_) -> unexpected end, Get = fun(K) -> [ Def || Def <- Defs, Kind(Def) == K ] end, {Env1, TypeDefs} = check_typedefs(Env, Get(type)), create_type_errors(), + check_unexpected(Get(unexpected)), Env2 = case What of namespace -> Env1; @@ -646,6 +648,9 @@ check_typedef(Env, {variant_t, Cons}) -> {variant_t, [ {constr_t, Ann, Con, [ check_type(Env, Arg) || Arg <- Args ]} || {constr_t, Ann, Con, Args} <- Cons ]}. +check_unexpected(Xs) -> + [ type_error(X) || X <- Xs ]. + -spec check_type(env(), aeso_syntax:type()) -> aeso_syntax:type(). check_type(Env, T) -> check_type(Env, T, 0). @@ -1869,6 +1874,12 @@ pp_error({duplicate_definition, Name, Locs}) -> pp_error({duplicate_scope, Kind, Name, OtherKind, L}) -> io_lib:format("The ~p ~s (at ~s) has the same name as a ~p at ~s\n", [Kind, pp(Name), pp_loc(Name), OtherKind, pp_loc(L)]); +pp_error({include, {string, Pos, Name}}) -> + io_lib:format("Include of '~s' at ~s\nnot allowed, include only allowed at top level.\n", + [binary_to_list(Name), pp_loc(Pos)]); +pp_error({namespace, _Pos, {con, Pos, Name}, _Def}) -> + io_lib:format("Nested namespace not allowed\nNamespace '~s' at ~s not defined at top level.\n", + [Name, pp_loc(Pos)]); pp_error(Err) -> io_lib:format("Unknown error: ~p\n", [Err]). diff --git a/test/aeso_compiler_tests.erl b/test/aeso_compiler_tests.erl index 1343c73..23a760c 100644 --- a/test/aeso_compiler_tests.erl +++ b/test/aeso_compiler_tests.erl @@ -203,4 +203,7 @@ failing_contracts() -> " (gas : int, value : int) => map(string, int)">>]} , {"include", [<<"file include, line 1, column 9: includes not allowed in this context\n">>]} + , {"bad_include_and_ns", + [<<"Include of 'included.aes' at line 2, column 11\nnot allowed, include only allowed at top level.">>, + <<"Nested namespace not allowed\nNamespace 'Foo' at line 3, column 13 not defined at top level.">>]} ]. diff --git a/test/contracts/bad_include_and_ns.aes b/test/contracts/bad_include_and_ns.aes new file mode 100644 index 0000000..6644d2c --- /dev/null +++ b/test/contracts/bad_include_and_ns.aes @@ -0,0 +1,6 @@ +contract Bad = + include "included.aes" + namespace Foo = + function foo() = 42 + + function foo() = 43 diff --git a/test/contracts/include.aes b/test/contracts/include.aes index 2431aa5..b7afd65 100644 --- a/test/contracts/include.aes +++ b/test/contracts/include.aes @@ -2,7 +2,6 @@ include "included.aes" include "../contracts/included2.aes" contract Include = - // include "maps.aes" function foo() = Included.foo() < Included2a.bar()