From ac428d1e3644491474e172018c6393fecf3caa58 Mon Sep 17 00:00:00 2001 From: Gaith Hallak Date: Sun, 30 Apr 2023 21:15:14 +0300 Subject: [PATCH] Move error reporting to aeso_tc_env --- src/aeso_ast_infer_types.erl | 2 +- src/aeso_tc_env.erl | 27 +++++++++++++++++++++++++++ src/aeso_tc_errors.erl | 30 ++++-------------------------- src/aeso_tc_options.erl | 2 +- 4 files changed, 33 insertions(+), 28 deletions(-) diff --git a/src/aeso_ast_infer_types.erl b/src/aeso_ast_infer_types.erl index 19ca056..2ed4816 100644 --- a/src/aeso_ast_infer_types.erl +++ b/src/aeso_ast_infer_types.erl @@ -51,7 +51,7 @@ set_qname(A, B) -> aeso_tc_name_manip:set_qname(A, B). type_error(A) -> aeso_tc_errors:type_error(A). create_type_errors() -> aeso_tc_errors:create_type_errors(). -destroy_and_report_type_errors(A) -> aeso_tc_errors:destroy_and_report_type_errors(A). +destroy_and_report_type_errors(A) -> aeso_tc_env:destroy_and_report_type_errors(A). %% ------- diff --git a/src/aeso_tc_env.erl b/src/aeso_tc_env.erl index 03174a2..b24e9ab 100644 --- a/src/aeso_tc_env.erl +++ b/src/aeso_tc_env.erl @@ -68,6 +68,8 @@ , empty_env/0 ]). +-export([destroy_and_report_type_errors/1]). + -export_type([env/0]). -include("aeso_utils.hrl"). @@ -147,6 +149,7 @@ infer_const(A, B) -> aeso_ast_infer_types:infer_const(A, B). name(A) -> aeso_tc_name_manip:name(A). qname(A) -> aeso_tc_name_manip:qname(A). qid(A, B) -> aeso_tc_name_manip:qid(A, B). +qcon(A, B) -> aeso_tc_name_manip:qcon(A, B). set_qname(A, B) -> aeso_tc_name_manip:set_qname(A, B). %% ------- @@ -992,3 +995,27 @@ global_env() -> maps:from_list([{N, [#field_info{ ann = [], field_t = T, record_t = Tx, kind = record }]} || {N, T} <- TxFlds ]) }. + +destroy_and_report_type_errors(Env) -> + Errors0 = lists:reverse(aeso_tc_ets_manager:ets_tab2list(type_errors)), + %% io:format("Type errors now: ~p\n", [Errors0]), + aeso_tc_errors:destroy_type_errors(), + Errors = [ aeso_tc_errors:mk_error(unqualify(Env, Err)) || Err <- Errors0 ], + aeso_errors:throw(Errors). %% No-op if Errors == [] + +%% Strip current namespace from error message for nicer printing. +unqualify(Env, {qid, Ann, Xs}) -> + qid(Ann, unqualify1(aeso_tc_env:namespace(Env), Xs)); +unqualify(Env, {qcon, Ann, Xs}) -> + qcon(Ann, unqualify1(aeso_tc_env:namespace(Env), Xs)); +unqualify(Env, T) when is_tuple(T) -> + list_to_tuple(unqualify(Env, tuple_to_list(T))); +unqualify(Env, [H | T]) -> [unqualify(Env, H) | unqualify(Env, T)]; +unqualify(_Env, X) -> X. + +unqualify1(NS, Xs) -> + try lists:split(length(NS), Xs) of + {NS, Ys} -> Ys; + _ -> Xs + catch _:_ -> Xs + end. diff --git a/src/aeso_tc_errors.erl b/src/aeso_tc_errors.erl index 67453dc..06481fd 100644 --- a/src/aeso_tc_errors.erl +++ b/src/aeso_tc_errors.erl @@ -5,14 +5,13 @@ -export([cannot_unify/4 , type_error/1 , create_type_errors/0 - , destroy_and_report_type_errors/1 + , destroy_type_errors/0 + , mk_error/1 ]). %% -- Moved functions -------------------------------------------------------- name(A) -> aeso_tc_name_manip:name(A). -qid(A, B) -> aeso_tc_name_manip:qid(A, B). -qcon(A, B) -> aeso_tc_name_manip:qcon(A, B). %% ------- @@ -42,29 +41,8 @@ type_error(Err) -> create_type_errors() -> aeso_tc_ets_manager:ets_new(type_errors, [bag]). -destroy_and_report_type_errors(Env) -> - Errors0 = lists:reverse(aeso_tc_ets_manager:ets_tab2list(type_errors)), - %% io:format("Type errors now: ~p\n", [Errors0]), - aeso_tc_ets_manager:ets_delete(type_errors), - Errors = [ mk_error(unqualify(Env, Err)) || Err <- Errors0 ], - aeso_errors:throw(Errors). %% No-op if Errors == [] - -%% Strip current namespace from error message for nicer printing. -unqualify(Env, {qid, Ann, Xs}) -> - qid(Ann, unqualify1(aeso_tc_env:namespace(Env), Xs)); -unqualify(Env, {qcon, Ann, Xs}) -> - qcon(Ann, unqualify1(aeso_tc_env:namespace(Env), Xs)); -unqualify(Env, T) when is_tuple(T) -> - list_to_tuple(unqualify(Env, tuple_to_list(T))); -unqualify(Env, [H | T]) -> [unqualify(Env, H) | unqualify(Env, T)]; -unqualify(_Env, X) -> X. - -unqualify1(NS, Xs) -> - try lists:split(length(NS), Xs) of - {NS, Ys} -> Ys; - _ -> Xs - catch _:_ -> Xs - end. +destroy_type_errors() -> + aeso_tc_ets_manager:ets_delete(type_errors). mk_t_err(Pos, Msg) -> aeso_errors:new(type_error, Pos, lists:flatten(Msg)). diff --git a/src/aeso_tc_options.erl b/src/aeso_tc_options.erl index b9de2ee..eca3fd3 100644 --- a/src/aeso_tc_options.erl +++ b/src/aeso_tc_options.erl @@ -10,7 +10,7 @@ type_error(A) -> aeso_tc_errors:type_error(A). create_type_errors() -> aeso_tc_errors:create_type_errors(). -destroy_and_report_type_errors(A) -> aeso_tc_errors:destroy_and_report_type_errors(A). +destroy_and_report_type_errors(A) -> aeso_tc_env:destroy_and_report_type_errors(A). %% -------