@@ -496,10 +496,14 @@ vann(Tree, Env) ->
496496 vann_list_comp (Tree , Env );
497497 binary_comp ->
498498 vann_binary_comp (Tree , Env );
499+ map_comp ->
500+ vann_map_comp (Tree , Env );
499501 generator ->
500502 vann_generator (Tree , Env );
501503 binary_generator ->
502504 vann_binary_generator (Tree , Env );
505+ map_generator ->
506+ vann_map_generator (Tree , Env );
503507 block_expr ->
504508 vann_block_expr (Tree , Env );
505509 macro ->
@@ -653,7 +657,7 @@ vann_receive_expr(Tree, Env) ->
653657
654658vann_list_comp (Tree , Env ) ->
655659 Es = erl_syntax :list_comp_body (Tree ),
656- {Es1 , {Bound1 , Free1 }} = vann_list_comp_body (Es , Env ),
660+ {Es1 , {Bound1 , Free1 }} = vann_comp_body (Es , Env ),
657661 Env1 = ordsets :union (Env , Bound1 ),
658662 T = erl_syntax :list_comp_template (Tree ),
659663 {T1 , _ , Free2 } = vann (T , Env1 ),
@@ -662,34 +666,9 @@ vann_list_comp(Tree, Env) ->
662666 Tree1 = rewrite (Tree , erl_syntax :list_comp (T1 , Es1 )),
663667 {ann_bindings (Tree1 , Env , Bound , Free ), Bound , Free }.
664668
665- vann_list_comp_body_join () ->
666- fun (T , {Env , Bound , Free }) ->
667- {T1 , Bound1 , Free1 } = case erl_syntax :type (T ) of
668- binary_generator ->
669- vann_binary_generator (T ,Env );
670- generator ->
671- vann_generator (T , Env );
672- _ ->
673- % % Bindings in filters are not
674- % % exported to the rest of the
675- % % body.
676- {T2 , _ , Free2 } = vann (T , Env ),
677- {T2 , [], Free2 }
678- end ,
679- Env1 = ordsets :union (Env , Bound1 ),
680- {T1 , {Env1 , ordsets :union (Bound , Bound1 ),
681- ordsets :union (Free ,
682- ordsets :subtract (Free1 , Bound ))}}
683- end .
684-
685- vann_list_comp_body (Ts , Env ) ->
686- F = vann_list_comp_body_join (),
687- {Ts1 , {_ , Bound , Free }} = lists :mapfoldl (F , {Env , [], []}, Ts ),
688- {Ts1 , {Bound , Free }}.
689-
690669vann_binary_comp (Tree , Env ) ->
691670 Es = erl_syntax :binary_comp_body (Tree ),
692- {Es1 , {Bound1 , Free1 }} = vann_binary_comp_body (Es , Env ),
671+ {Es1 , {Bound1 , Free1 }} = vann_comp_body (Es , Env ),
693672 Env1 = ordsets :union (Env , Bound1 ),
694673 T = erl_syntax :binary_comp_template (Tree ),
695674 {T1 , _ , Free2 } = vann (T , Env1 ),
@@ -698,13 +677,31 @@ vann_binary_comp(Tree, Env) ->
698677 Tree1 = rewrite (Tree , erl_syntax :binary_comp (T1 , Es1 )),
699678 {ann_bindings (Tree1 , Env , Bound , Free ), Bound , Free }.
700679
701- vann_binary_comp_body_join () ->
680+ vann_map_comp (Tree , Env ) ->
681+ Es = erl_syntax :map_comp_body (Tree ),
682+ {Es1 , {Bound1 , Free1 }} = vann_comp_body (Es , Env ),
683+ Env1 = ordsets :union (Env , Bound1 ),
684+ T = erl_syntax :map_comp_template (Tree ),
685+ {T1 , _ , Free2 } = vann (T , Env1 ),
686+ Free = ordsets :union (Free1 , ordsets :subtract (Free2 , Bound1 )),
687+ Bound = [],
688+ Tree1 = rewrite (Tree , erl_syntax :map_comp (T1 , Es1 )),
689+ {ann_bindings (Tree1 , Env , Bound , Free ), Bound , Free }.
690+
691+ vann_comp_body (Ts , Env ) ->
692+ F = vann_comp_body_join (),
693+ {Ts1 , {_ , Bound , Free }} = lists :mapfoldl (F , {Env , [], []}, Ts ),
694+ {Ts1 , {Bound , Free }}.
695+
696+ vann_comp_body_join () ->
702697 fun (T , {Env , Bound , Free }) ->
703698 {T1 , Bound1 , Free1 } = case erl_syntax :type (T ) of
704- binary_generator ->
705- vann_binary_generator (T , Env );
706- generator ->
699+ binary_generator ->
700+ vann_binary_generator (T ,Env );
701+ generator ->
707702 vann_generator (T , Env );
703+ map_generator ->
704+ vann_map_generator (T ,Env );
708705 _ ->
709706 % % Bindings in filters are not
710707 % % exported to the rest of the
@@ -718,11 +715,6 @@ vann_binary_comp_body_join() ->
718715 ordsets :subtract (Free1 , Bound ))}}
719716 end .
720717
721- vann_binary_comp_body (Ts , Env ) ->
722- F = vann_binary_comp_body_join (),
723- {Ts1 , {_ , Bound , Free }} = lists :mapfoldl (F , {Env , [], []}, Ts ),
724- {Ts1 , {Bound , Free }}.
725-
726718% % In list comprehension generators, the pattern variables are always
727719% % viewed as new occurrences, shadowing whatever is in the input
728720% % environment (thus, the pattern contains no variable uses, only
@@ -744,6 +736,14 @@ vann_binary_generator(Tree, Env) ->
744736 Tree1 = rewrite (Tree , erl_syntax :binary_generator (P1 , E1 )),
745737 {ann_bindings (Tree1 , Env , Bound , Free ), Bound , Free }.
746738
739+ vann_map_generator (Tree , Env ) ->
740+ P = erl_syntax :map_generator_pattern (Tree ),
741+ {P1 , Bound , _ } = vann_pattern (P , []),
742+ E = erl_syntax :map_generator_body (Tree ),
743+ {E1 , _ , Free } = vann (E , Env ),
744+ Tree1 = rewrite (Tree , erl_syntax :map_generator (P1 , E1 )),
745+ {ann_bindings (Tree1 , Env , Bound , Free ), Bound , Free }.
746+
747747vann_block_expr (Tree , Env ) ->
748748 Es = erl_syntax :block_expr_body (Tree ),
749749 {Es1 , {Bound , Free }} = vann_body (Es , Env ),
0 commit comments