diff options
author | Péter Gömöri <gomoripeti@gmail.com> | 2021-01-11 02:40:15 +0100 |
---|---|---|
committer | Péter Gömöri <gomoripeti@gmail.com> | 2021-01-11 02:40:15 +0100 |
commit | f098f67215a484a17837fede5b9c0c7a23c4c411 (patch) | |
tree | 27d5c1c09dcc5907eb5fb41e6005df8c8fb6c2ad /lib/syntax_tools/test/syntax_tools_SUITE.erl | |
parent | 165262309e9c47d1008313945ad83fc1cb79b3f0 (diff) | |
download | erlang-f098f67215a484a17837fede5b9c0c7a23c4c411.tar.gz |
Handle macros in patterns
The dodger used to replace a macro with a local function call. That works in
expressions but not in patterns like function heads or catch patterns. Instead
of a function call a tuple syntax is used which works in more places.
This change is motivated by the commonly used `?EXCEPTION` macro
```
try
...
catch
?EXCEPTION(Class, Reason, StackToken) ->
...
end.
```
Open source examples:
https://github.com/devinus/poolboy/commit/5d40cc517edc9bb8ee70756544167b63f66662f0
https://github.com/eproxus/meck/commit/558e925b48ce257b12e381080c851dc49c87d7bb
Fixes ERL-1429
Diffstat (limited to 'lib/syntax_tools/test/syntax_tools_SUITE.erl')
-rw-r--r-- | lib/syntax_tools/test/syntax_tools_SUITE.erl | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/lib/syntax_tools/test/syntax_tools_SUITE.erl b/lib/syntax_tools/test/syntax_tools_SUITE.erl index 9baf36ce11..14a7912642 100644 --- a/lib/syntax_tools/test/syntax_tools_SUITE.erl +++ b/lib/syntax_tools/test/syntax_tools_SUITE.erl @@ -25,7 +25,8 @@ %% Test cases -export([app_test/1,appup_test/1,smoke_test/1,revert/1,revert_map/1, revert_map_type/1,wrapped_subtrees/1, - t_abstract_type/1,t_erl_parse_type/1,t_type/1, t_epp_dodger/1, + t_abstract_type/1,t_erl_parse_type/1,t_type/1, + t_epp_dodger/1,t_epp_dodger_clever/1, t_comment_scan/1,t_igor/1,t_erl_tidy/1,t_prettypr/1]). suite() -> [{ct_hooks,[ts_install_cth]}]. @@ -33,7 +34,8 @@ suite() -> [{ct_hooks,[ts_install_cth]}]. all() -> [app_test,appup_test,smoke_test,revert,revert_map,revert_map_type, wrapped_subtrees, - t_abstract_type,t_erl_parse_type,t_type,t_epp_dodger, + t_abstract_type,t_erl_parse_type,t_type, + t_epp_dodger,t_epp_dodger_clever, t_comment_scan,t_igor,t_erl_tidy,t_prettypr]. groups() -> @@ -330,6 +332,13 @@ t_epp_dodger(Config) when is_list(Config) -> ok = test_epp_dodger(Filenames,DataDir,PrivDir), ok. +t_epp_dodger_clever(Config) when is_list(Config) -> + DataDir = ?config(data_dir, Config), + PrivDir = ?config(priv_dir, Config), + Filenames = ["epp_dodger_clever.erl"], + ok = test_epp_dodger_clever(Filenames,DataDir,PrivDir), + ok. + t_comment_scan(Config) when is_list(Config) -> DataDir = ?config(data_dir, Config), Filenames = test_files(), @@ -447,9 +456,30 @@ test_epp_dodger([Filename|Files],DataDir,PrivDir) -> ok = pretty_print_parse_forms(FsForms,PrivDir,Filename), test_epp_dodger(Files,DataDir,PrivDir). +test_epp_dodger_clever([], _, _) -> ok; +test_epp_dodger_clever([Filename|Files],DataDir,PrivDir) -> + io:format("Parsing ~p~n", [Filename]), + InFile = filename:join(DataDir, Filename), + Parsers = [{fun(File) -> + epp_dodger:parse_file(File, [clever]) + end, parse_file}, + {fun(File) -> + epp_dodger:quick_parse_file(File, [clever]) + end, quick_parse_file}], + FsForms = parse_with(Parsers, InFile), + ok = pretty_print_parse_forms(FsForms,PrivDir,Filename), + test_epp_dodger_clever(Files,DataDir,PrivDir). + parse_with([],_) -> []; parse_with([{Fun,ParserType}|Funs],File) -> {ok, Fs} = Fun(File), + ErrorMarkers = [begin + print_error_markers(F, File), + F + end + || F <- Fs, + erl_syntax:type(F) =:= error_marker], + [] = ErrorMarkers, [{Fs,ParserType}|parse_with(Funs,File)]. pretty_print_parse_forms([],_,_) -> ok; |