Add include directive

Add an include directive to include namespaces into a contract. Only allowed at the top level.

To allow includes, either call through aeso_compiler:file or set the option `allow_include` (and add `include_path`(s)).
This commit is contained in:
Hans Svensson
2019-02-05 08:52:40 +01:00
committed by Ulf Norell
parent 0a5b80668f
commit 2b7490776e
9 changed files with 139 additions and 40 deletions
+31 -12
View File
@@ -21,8 +21,16 @@
-include("aeso_icode.hrl").
-type option() :: pp_sophia_code | pp_ast | pp_types | pp_typed_ast |
pp_icode| pp_assembler | pp_bytecode.
-type option() :: pp_sophia_code
| pp_ast
| pp_types
| pp_typed_ast
| pp_icode
| pp_assembler
| pp_bytecode
| {include_path, [string()]}
| {allow_include, boolean()}
| {src_file, string()}.
-type options() :: [option()].
-export_type([ option/0
@@ -40,12 +48,13 @@ version() ->
-spec file(string()) -> {ok, map()} | {error, binary()}.
file(Filename) ->
file(Filename, []).
Dir = filename:dirname(Filename),
file(Filename, [{include_path, [Dir]}]).
-spec file(string(), options()) -> {ok, map()} | {error, binary()}.
file(File, Options) ->
case read_contract(File) of
{ok, Bin} -> from_string(Bin, Options);
{ok, Bin} -> from_string(Bin, [{src_file, File}, {allow_include, true} | Options]);
{error, Error} ->
ErrorString = [File,": ",file:format_error(Error)],
{error, join_errors("File errors", [ErrorString], fun(E) -> E end)}
@@ -213,9 +222,6 @@ icode_to_term(T, V) ->
icodes_to_terms(Ts, Vs) ->
[ icode_to_term(T, V) || {T, V} <- lists:zip(Ts, Vs) ].
parse(C,_Options) ->
parse_string(C).
to_icode(TypedAst, Options) ->
aeso_ast_to_icode:convert_typed(TypedAst, Options).
@@ -265,9 +271,9 @@ sophia_type_to_typerep(String) ->
catch _:_ -> {error, bad_type}
end.
parse_string(Text) ->
parse(Text, Options) ->
%% Try and return something sensible here!
case aeso_parser:string(Text) of
case aeso_parser:string(Text, Options) of
%% Yay, it worked!
{ok, Contract} -> Contract;
%% Scan errors.
@@ -280,12 +286,25 @@ parse_string(Text) ->
parse_error(Pos, Error);
{error, {Pos, ambiguous_parse, As}} ->
ErrorString = io_lib:format("Ambiguous ~p", [As]),
parse_error(Pos, ErrorString)
parse_error(Pos, ErrorString);
%% Include error
{error, {Pos, include_not_allowed}} ->
parse_error(Pos, "includes not allowed in this context");
{error, {Pos, include_error}} ->
parse_error(Pos, "could not find include file")
end.
parse_error({Line, Pos}, ErrorString) ->
Error = io_lib:format("line ~p, column ~p: ~s", [Line, Pos, ErrorString]),
parse_error(Pos, ErrorString) ->
Error = io_lib:format("~s: ~s", [pos_error(Pos), ErrorString]),
error({parse_errors, [Error]}).
read_contract(Name) ->
file:read_file(Name).
pos_error({Line, Pos}) ->
io_lib:format("line ~p, column ~p", [Line, Pos]);
pos_error({no_file, Line, Pos}) ->
pos_error({Line, Pos});
pos_error({File, Line, Pos}) ->
io_lib:format("file ~s, line ~p, column ~p", [File, Line, Pos]).