From 204252d7dc8e2936f14ef48346317146a2f5f4af Mon Sep 17 00:00:00 2001 From: Zachary Dean Date: Wed, 14 Aug 2019 14:39:08 +0200 Subject: Add unwrap calls to map_field_* in erl_syntax This adds missing calls to unwrap/1 for the map_field_* name and value functions and puts them inline with map_expr_fields/1. Using these functions with "wrapped" nodes fails with badarg. --- lib/syntax_tools/src/erl_syntax.erl | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/syntax_tools/src/erl_syntax.erl b/lib/syntax_tools/src/erl_syntax.erl index b856a5d1dd..385094d5bd 100644 --- a/lib/syntax_tools/src/erl_syntax.erl +++ b/lib/syntax_tools/src/erl_syntax.erl @@ -2166,11 +2166,11 @@ revert_map_field_assoc(Node) -> -spec map_field_assoc_name(syntaxTree()) -> syntaxTree(). map_field_assoc_name(Node) -> - case Node of + case unwrap(Node) of {map_field_assoc, _, Name, _} -> Name; - _ -> - (data(Node))#map_field_assoc.name + Node1 -> + (data(Node1))#map_field_assoc.name end. @@ -2182,11 +2182,11 @@ map_field_assoc_name(Node) -> -spec map_field_assoc_value(syntaxTree()) -> syntaxTree(). map_field_assoc_value(Node) -> - case Node of + case unwrap(Node) of {map_field_assoc, _, _, Value} -> Value; - _ -> - (data(Node))#map_field_assoc.value + Node1 -> + (data(Node1))#map_field_assoc.value end. @@ -2224,11 +2224,11 @@ revert_map_field_exact(Node) -> -spec map_field_exact_name(syntaxTree()) -> syntaxTree(). map_field_exact_name(Node) -> - case Node of + case unwrap(Node) of {map_field_exact, _, Name, _} -> Name; - _ -> - (data(Node))#map_field_exact.name + Node1 -> + (data(Node1))#map_field_exact.name end. @@ -2240,11 +2240,11 @@ map_field_exact_name(Node) -> -spec map_field_exact_value(syntaxTree()) -> syntaxTree(). map_field_exact_value(Node) -> - case Node of + case unwrap(Node) of {map_field_exact, _, _, Value} -> Value; - _ -> - (data(Node))#map_field_exact.value + Node1 -> + (data(Node1))#map_field_exact.value end. -- cgit v1.2.3 From 98462d8ec91dc34a06f5a2801c906ca1a0dd4ba1 Mon Sep 17 00:00:00 2001 From: zadean Date: Mon, 19 Aug 2019 14:35:53 +0200 Subject: Also unwrap map_type_* name and value --- lib/syntax_tools/src/erl_syntax.erl | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/syntax_tools/src/erl_syntax.erl b/lib/syntax_tools/src/erl_syntax.erl index 385094d5bd..eeb9bc20ab 100644 --- a/lib/syntax_tools/src/erl_syntax.erl +++ b/lib/syntax_tools/src/erl_syntax.erl @@ -5311,11 +5311,11 @@ revert_map_type_assoc(Node) -> -spec map_type_assoc_name(syntaxTree()) -> syntaxTree(). map_type_assoc_name(Node) -> - case Node of + case unwrap(Node) of {type, _, map_field_assoc, [Name, _]} -> Name; - _ -> - (data(Node))#map_type_assoc.name + Node1 -> + (data(Node1))#map_type_assoc.name end. @@ -5327,11 +5327,11 @@ map_type_assoc_name(Node) -> -spec map_type_assoc_value(syntaxTree()) -> syntaxTree(). map_type_assoc_value(Node) -> - case Node of + case unwrap(Node) of {type, _, map_field_assoc, [_, Value]} -> Value; - _ -> - (data(Node))#map_type_assoc.value + Node1 -> + (data(Node1))#map_type_assoc.value end. @@ -5369,11 +5369,11 @@ revert_map_type_exact(Node) -> -spec map_type_exact_name(syntaxTree()) -> syntaxTree(). map_type_exact_name(Node) -> - case Node of + case unwrap(Node) of {type, _, map_field_exact, [Name, _]} -> Name; - _ -> - (data(Node))#map_type_exact.name + Node1 -> + (data(Node1))#map_type_exact.name end. @@ -5385,11 +5385,11 @@ map_type_exact_name(Node) -> -spec map_type_exact_value(syntaxTree()) -> syntaxTree(). map_type_exact_value(Node) -> - case Node of + case unwrap(Node) of {type, _, map_field_exact, [_, Value]} -> Value; - _ -> - (data(Node))#map_type_exact.value + Node1 -> + (data(Node1))#map_type_exact.value end. -- cgit v1.2.3 From 19697637a41f7e5199f017abae44bac5e7367c57 Mon Sep 17 00:00:00 2001 From: zadean Date: Mon, 19 Aug 2019 14:47:32 +0200 Subject: Update test suite Add record with exact and associated map types to type_specs.erl. The record forces the erl_parse format for map types to be retained. Add test wrapped_subtrees to the test suite. It ensures that each erl_parse node it encounters can be wrapped and accessed with erl_syntax:subtrees/1 without error. --- lib/syntax_tools/test/syntax_tools_SUITE.erl | 36 ++++++++++++++++++++++ .../test/syntax_tools_SUITE_data/type_specs.erl | 3 ++ 2 files changed, 39 insertions(+) diff --git a/lib/syntax_tools/test/syntax_tools_SUITE.erl b/lib/syntax_tools/test/syntax_tools_SUITE.erl index 43c17e9f1f..cabd29cb56 100644 --- a/lib/syntax_tools/test/syntax_tools_SUITE.erl +++ b/lib/syntax_tools/test/syntax_tools_SUITE.erl @@ -26,6 +26,7 @@ %% Test cases -export([app_test/1,appup_test/1,smoke_test/1,revert/1,revert_map/1, + wrapped_subtrees/1, t_abstract_type/1,t_erl_parse_type/1,t_epp_dodger/1, t_comment_scan/1,t_igor/1,t_erl_tidy/1]). @@ -33,6 +34,7 @@ suite() -> [{ct_hooks,[ts_install_cth]}]. all() -> [app_test,appup_test,smoke_test,revert,revert_map, + wrapped_subtrees, t_abstract_type,t_erl_parse_type,t_epp_dodger, t_comment_scan,t_igor,t_erl_tidy]. @@ -124,6 +126,40 @@ revert_map(Config) when is_list(Config) -> ?t:timetrap_cancel(Dog). +%% Read with erl_parse, wrap each tree node with erl_syntax and check that +%% erl_syntax:subtrees can access the wrapped node. +wrapped_subtrees(Config) when is_list(Config) -> + Dog = ?t:timetrap(?t:minutes(2)), + Wc = filename:join([code:lib_dir(stdlib),"src","*.erl"]), + Fs = filelib:wildcard(Wc) ++ test_files(Config), + Path = [filename:join(code:lib_dir(stdlib), "include"), + filename:join(code:lib_dir(kernel), "include")], + io:format("~p files\n", [length(Fs)]), + Map = fun (File) -> wrapped_subtrees_file(File, Path) end, + case p_run(Map, Fs) of + 0 -> ok; + N -> ?t:fail({N,errors}) + end, + ?t:timetrap_cancel(Dog). + +wrapped_subtrees_file(File, Path) -> + case epp:parse_file(File, Path, []) of + {ok,Fs0} -> + lists:foreach(fun wrap_each/1, Fs0) + end. + +wrap_each(Tree) -> + % only `wrap` top-level erl_parse node + Tree1 = erl_syntax:set_pos(Tree, erl_syntax:get_pos(Tree)), + % assert ability to access subtrees of wrapped node with erl_syntax:subtrees/1 + case erl_syntax:subtrees(Tree1) of + [] -> ok; + List -> + GrpsF = fun(Group) -> + lists:foreach(fun wrap_each/1, Group) + end, + lists:foreach(GrpsF, List) + end. %% api tests diff --git a/lib/syntax_tools/test/syntax_tools_SUITE_data/type_specs.erl b/lib/syntax_tools/test/syntax_tools_SUITE_data/type_specs.erl index e4f8a1c3de..b23acdb39e 100644 --- a/lib/syntax_tools/test/syntax_tools_SUITE_data/type_specs.erl +++ b/lib/syntax_tools/test/syntax_tools_SUITE_data/type_specs.erl @@ -37,6 +37,9 @@ -record(par, {a :: undefined | ?MODULE}). +-record(mt, {e :: #{any() := any()}, + a :: #{any() => any()}}). + -record(r0, {}). -record(r, -- cgit v1.2.3