43 lines
1.1 KiB
Erlang
43 lines
1.1 KiB
Erlang
-module(aeso_constants).
|
|
|
|
-export([string/1, get_type/1]).
|
|
|
|
string(Str) ->
|
|
case aeso_parser:string("let _ = " ++ Str) of
|
|
{ok, [{letval, _, _, _, E}]} -> {ok, E};
|
|
{ok, Other} -> error({internal_error, should_be_letval, Other});
|
|
Err -> Err
|
|
end.
|
|
|
|
get_type(Str) ->
|
|
case aeso_parser:string("let _ = " ++ Str) of
|
|
{ok, [Ast]} ->
|
|
AstT = aeso_ast_infer_types:infer_constant(Ast),
|
|
T = ast_to_type(AstT),
|
|
{ok, T};
|
|
{ok, Other} -> error({internal_error, should_be_letval, Other});
|
|
Err -> Err
|
|
end.
|
|
|
|
ast_to_type({id, _, T}) ->
|
|
T;
|
|
ast_to_type({tuple_t, _, []}) -> "()";
|
|
ast_to_type({tuple_t, _, Ts}) ->
|
|
"(" ++ list_ast_to_type(Ts) ++ ")";
|
|
ast_to_type({app_t,_, {id, _, "list"}, [T]}) ->
|
|
lists:flatten("list(" ++ ast_to_type(T) ++ ")");
|
|
ast_to_type({app_t,_, {id, _, "option"}, [T]}) ->
|
|
lists:flatten("option(" ++ ast_to_type(T) ++ ")").
|
|
|
|
list_ast_to_type([T]) ->
|
|
ast_to_type(T);
|
|
list_ast_to_type([T|Ts]) ->
|
|
ast_to_type(T)
|
|
++ ", "
|
|
++ list_ast_to_type(Ts).
|
|
|
|
|
|
|
|
|
|
|