File 0538-named_fun_expr-annotate-bindings-fix.patch of Package erlang

From 36091468c3e042a3cf4838af4bf8191de9f60e7d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marko=20Min=C4=91ek?= <marko.mindek@invariant.hr>
Date: Wed, 30 Nov 2022 13:23:45 +0100
Subject: [PATCH] named_fun_expr annotate bindings fix

---
 lib/syntax_tools/src/erl_syntax_lib.erl      | 14 +++++++++
 lib/syntax_tools/test/syntax_tools_SUITE.erl | 31 ++++++++++++++++++--
 2 files changed, 43 insertions(+), 2 deletions(-)

diff --git a/lib/syntax_tools/src/erl_syntax_lib.erl b/lib/syntax_tools/src/erl_syntax_lib.erl
index 78c7ab9e46..14ce07b486 100644
--- a/lib/syntax_tools/src/erl_syntax_lib.erl
+++ b/lib/syntax_tools/src/erl_syntax_lib.erl
@@ -538,6 +538,8 @@ vann(Tree, Env) ->
             vann_function(Tree, Env);
         fun_expr ->
             vann_fun_expr(Tree, Env);
+        named_fun_expr ->
+            vann_named_fun_expr(Tree, Env);
         list_comp ->
             vann_list_comp(Tree, Env);
         binary_comp ->
@@ -583,6 +585,18 @@ vann_fun_expr(Tree, Env) ->
     Bound = [],
     {ann_bindings(Tree1, Env, Bound, Free), Bound, Free}.
 
+vann_named_fun_expr(Tree, Env) ->
+    N = erl_syntax:named_fun_expr_name(Tree),
+    NBound = [erl_syntax:variable_name(N)],
+    NFree = [],
+    N1 = ann_bindings(N, Env, NBound, NFree),
+    Env1 = ordsets:union(Env, NBound),
+    Cs = erl_syntax:named_fun_expr_clauses(Tree),
+    {Cs1, {_, Free}} = vann_clauses(Cs, Env1),
+    Tree1 = rewrite(Tree, erl_syntax:named_fun_expr(N1,Cs1)),
+    Bound = [],
+    {ann_bindings(Tree1, Env, Bound, Free), Bound, Free}.
+
 vann_match_expr(Tree, Env) ->
     E = erl_syntax:match_expr_body(Tree),
     {E1, Bound1, Free1} = vann(E, Env),
diff --git a/lib/syntax_tools/test/syntax_tools_SUITE.erl b/lib/syntax_tools/test/syntax_tools_SUITE.erl
index 6d91ab8f54..3553f7a71f 100644
--- a/lib/syntax_tools/test/syntax_tools_SUITE.erl
+++ b/lib/syntax_tools/test/syntax_tools_SUITE.erl
@@ -27,7 +27,7 @@
          revert_map_type/1,wrapped_subtrees/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_prettypr/1]).
+         t_comment_scan/1,t_prettypr/1,test_named_fun_bind_ann/1]).
 
 suite() -> [{ct_hooks,[ts_install_cth]}].
 
@@ -36,7 +36,7 @@ all() ->
      wrapped_subtrees,
      t_abstract_type,t_erl_parse_type,t_type,
      t_epp_dodger,t_epp_dodger_clever,
-     t_comment_scan,t_prettypr].
+     t_comment_scan,t_prettypr,test_named_fun_bind_ann].
 
 groups() -> 
     [].
@@ -355,6 +355,33 @@ t_prettypr(Config) when is_list(Config) ->
     ok = test_prettypr(Filenames,DataDir,PrivDir),
     ok.
 
+%% Test bug (#4733) fix for annotating bindings for named fun expressions
+test_named_fun_bind_ann(Config) when is_list(Config) ->
+    Fn = {named_fun,{6,5},
+            'F',
+            [{clause,{6,9},
+                [{var,{6,11},'Test'}],
+                [],
+                [{var,{7,13},'Test'}]}]},
+    AnnT = erl_syntax_lib:annotate_bindings(Fn, []),
+    [Env, Bound, Free] = erl_syntax:get_ann(AnnT),
+    {'env',[]} = Env,
+    {'bound',[]} = Bound,
+    {'free',[]} = Free,
+
+    NameVar = erl_syntax:named_fun_expr_name(AnnT),
+    Name = erl_syntax:variable_name(NameVar),
+    [NEnv, NBound, NFree] = erl_syntax:get_ann(NameVar),
+    {'env',[]} = NEnv,
+    {'bound',[Name]} = NBound,
+    {'free',[]} = NFree,
+
+    [Clause] = erl_syntax:named_fun_expr_clauses(AnnT),
+    [CEnv, CBound, CFree] = erl_syntax:get_ann(Clause),
+    {'env',[Name]} = CEnv,
+    {'bound',['Test']} = CBound,
+    {'free', []} = CFree.
+
 test_files(Config) ->
     DataDir = ?config(data_dir, Config),
     [ filename:join(DataDir,Filename) || Filename <- test_files() ].
-- 
2.35.3

openSUSE Build Service is sponsored by