File 1256-stdlib-Fix-erl_pp-rendering-unary-operators.patch of Package erlang
From 595adb64575aa69829a5be1a97b0e182df21f8fb Mon Sep 17 00:00:00 2001
From: Wojtek Mach <wojtek@wojtekmach.pl>
Date: Thu, 5 Aug 2021 13:49:09 +0200
Subject: [PATCH] stdlib: Fix `erl_pp` rendering unary +/- operators
---
lib/stdlib/src/erl_pp.erl | 6 ++++++
lib/stdlib/test/erl_pp_SUITE.erl | 26 +++++++++++++++++++++++---
2 files changed, 29 insertions(+), 3 deletions(-)
diff --git a/lib/stdlib/src/erl_pp.erl b/lib/stdlib/src/erl_pp.erl
index 9a0884fdba..d704d097c8 100644
--- a/lib/stdlib/src/erl_pp.erl
+++ b/lib/stdlib/src/erl_pp.erl
@@ -643,6 +643,12 @@ lexpr({match,_,Lhs,Rhs}, Prec, Opts) ->
Rl = lexpr(Rhs, R, Opts),
El = {list,[{cstep,[Pl,' ='],Rl}]},
maybe_paren(P, Prec, El);
+lexpr({op,_,Op,Arg}, Prec, Opts) when Op =:= '+';
+ Op =:= '-' ->
+ {P,R} = preop_prec(Op),
+ Ol = {reserved, leaf(atom_to_list(Op))},
+ El = [Ol,lexpr(Arg, R, Opts)],
+ maybe_paren(P, Prec, El);
lexpr({op,_,Op,Arg}, Prec, Opts) ->
{P,R} = preop_prec(Op),
Ol = leaf(format("~s ", [Op])),
diff --git a/lib/stdlib/test/erl_pp_SUITE.erl b/lib/stdlib/test/erl_pp_SUITE.erl
index ad49321aaa..b740ead730 100644
--- a/lib/stdlib/test/erl_pp_SUITE.erl
+++ b/lib/stdlib/test/erl_pp_SUITE.erl
@@ -51,7 +51,8 @@
otp_6321/1, otp_6911/1, otp_6914/1, otp_8150/1, otp_8238/1,
otp_8473/1, otp_8522/1, otp_8567/1, otp_8664/1, otp_9147/1,
otp_10302/1, otp_10820/1, otp_11100/1, otp_11861/1, pr_1014/1,
- otp_13662/1]).
+ otp_13662/1,
+ gh_5093/1]).
%% Internal export.
-export([ehook/6]).
@@ -81,7 +82,8 @@ groups() ->
{tickets, [],
[otp_6321, otp_6911, otp_6914, otp_8150, otp_8238,
otp_8473, otp_8522, otp_8567, otp_8664, otp_9147,
- otp_10302, otp_10820, otp_11100, otp_11861, pr_1014, otp_13662]}].
+ otp_10302, otp_10820, otp_11100, otp_11861, pr_1014, otp_13662,
+ gh_5093]}].
init_per_suite(Config) ->
Config.
@@ -1205,6 +1207,18 @@ otp_16435(_Config) ->
],
compile(Config, Ts).
+gh_5093(_Config) ->
+ assert_same("f() ->\n -1.\n"),
+ assert_same("f() ->\n +1.\n"),
+ assert_same("f() ->\n +1.1.\n"),
+ assert_same("f() ->\n +(+1).\n"),
+ assert_same("f(X) ->\n -X.\n"),
+ assert_same("f(X) ->\n +X.\n"),
+ assert_same("f(X, Y) ->\n X + Y.\n"),
+ assert_same("f(X, Y) ->\n X + +Y.\n"),
+ assert_same("f(X, Y) ->\n X - Y.\n"),
+ ok.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
compile(Config, Tests) ->
@@ -1385,3 +1399,10 @@ fail() ->
start_node(Name, Xargs) ->
PA = filename:dirname(code:which(?MODULE)),
test_server:start_node(Name, peer, [{args, "-pa " ++ PA ++ " " ++ Xargs}]).
+
+assert_same(Expected) when is_list(Expected) ->
+ Actual = binary_to_list(iolist_to_binary(parse_and_pp_forms(Expected, []))),
+ case Expected == Actual of
+ true -> ok;
+ false -> error({Expected, Actual})
+ end.
--
2.31.1