aboutsummaryrefslogtreecommitdiffstats
path: root/lib/syntax_tools/src/erl_prettypr.erl
diff options
context:
space:
mode:
authorHans Bolinder <[email protected]>2016-05-03 10:23:58 +0200
committerHans Bolinder <[email protected]>2016-05-09 08:27:22 +0200
commitdb39317ea85f7d8646b3da3d96f2f05954e16665 (patch)
tree46d145f6fe5cde5b4a0380cd12da33e7dc56404c /lib/syntax_tools/src/erl_prettypr.erl
parenta73f32b54f5679a2badb48e080203e28f3b40af7 (diff)
downloadotp-db39317ea85f7d8646b3da3d96f2f05954e16665.tar.gz
otp-db39317ea85f7d8646b3da3d96f2f05954e16665.tar.bz2
otp-db39317ea85f7d8646b3da3d96f2f05954e16665.zip
syntax_tools: Add support for new map type syntax
The pretty-printing of `...' in map types is complex. The representation of `...' can be changed before OTP 19.
Diffstat (limited to 'lib/syntax_tools/src/erl_prettypr.erl')
-rw-r--r--lib/syntax_tools/src/erl_prettypr.erl57
1 files changed, 48 insertions, 9 deletions
diff --git a/lib/syntax_tools/src/erl_prettypr.erl b/lib/syntax_tools/src/erl_prettypr.erl
index 9b6c5d977e..119d375746 100644
--- a/lib/syntax_tools/src/erl_prettypr.erl
+++ b/lib/syntax_tools/src/erl_prettypr.erl
@@ -27,8 +27,6 @@
-module(erl_prettypr).
--compile(export_all).
-
-export([format/1, format/2, best/1, best/2, layout/1, layout/2,
get_ctxt_precedence/1, set_ctxt_precedence/2,
get_ctxt_paperwidth/1, set_ctxt_paperwidth/2,
@@ -1133,20 +1131,25 @@ lay_2(Node, Ctxt) ->
text("map()");
Fs ->
{Prec, _PrecR} = type_preop_prec('#'),
- Es = seq(Fs,
- floating(text(",")), reset_prec(Ctxt),
- fun lay/2),
+ Es = lay_map_fields(Fs,
+ floating(text(",")),
+ reset_prec(Ctxt)),
D = beside(floating(text("#{")),
beside(par(Es),
floating(text("}")))),
maybe_parentheses(D, Prec, Ctxt)
end;
- map_type_pair ->
+ map_type_assoc ->
+ Name = erl_syntax:map_type_assoc_name(Node),
+ Value = erl_syntax:map_type_assoc_value(Node),
+ lay_type_assoc(Name, Value, Ctxt);
+
+ map_type_exact ->
Ctxt1 = reset_prec(Ctxt),
- D1 = lay(erl_syntax:map_type_pair_key(Node), Ctxt1),
- D2 = lay(erl_syntax:map_type_pair_value(Node), Ctxt1),
- par([D1, floating(text("=>")), D2], Ctxt1#ctxt.break_indent);
+ D1 = lay(erl_syntax:map_type_exact_name(Node), Ctxt1),
+ D2 = lay(erl_syntax:map_type_exact_value(Node), Ctxt1),
+ par([D1, floating(text(":=")), D2], Ctxt1#ctxt.break_indent);
integer_range_type ->
{PrecL, Prec, PrecR} = type_inop_prec('..'),
@@ -1397,6 +1400,42 @@ lay_error_info(T, Ctxt) ->
lay_concrete(T, Ctxt) ->
lay(erl_syntax:abstract(T), Ctxt).
+lay_map_fields([H | T], Separator, Ctxt) ->
+ case T of
+ [] ->
+ [case erl_syntax:type(H) of
+ map_type_assoc ->
+ lay_last_type_assoc(H, Ctxt);
+ _ ->
+ lay(H, Ctxt)
+ end];
+ _ ->
+ [maybe_append(Separator, lay(H, Ctxt))
+ | lay_map_fields(T, Separator, Ctxt)]
+ end;
+lay_map_fields([], _, _) ->
+ [empty()].
+
+lay_last_type_assoc(Node, Ctxt) ->
+ Name = erl_syntax:map_type_assoc_name(Node),
+ Value = erl_syntax:map_type_assoc_value(Node),
+ IsAny = fun({type,_,any,[]}) -> true;
+ %% ({var,_,'_'}) -> true;
+ (_) -> false
+ end,
+ case IsAny(Name) andalso IsAny(Value) of
+ true ->
+ text("...");
+ false ->
+ lay_type_assoc(Name, Value, Ctxt)
+ end.
+
+lay_type_assoc(Name, Value, Ctxt) ->
+ Ctxt1 = reset_prec(Ctxt),
+ D1 = lay(Name, Ctxt1),
+ D2 = lay(Value, Ctxt1),
+ par([D1, floating(text("=>")), D2], Ctxt1#ctxt.break_indent).
+
lay_type_application(Name, Arguments, Ctxt) ->
{PrecL, Prec} = func_prec(), %
D1 = lay(Name, set_prec(Ctxt, PrecL)),