@@ -56,10 +56,18 @@ def initialize(raw_node, recv, mid, mid_code_range, raw_args, last_arg, raw_bloc
5656 else
5757 @block_pass = nil
5858 @block_tbl = raw_block . locals
59+ @block_multi_targets = { }
5960 @block_f_args = case raw_block . parameters
6061 when Prism ::BlockParametersNode
6162 params = raw_block . parameters . parameters
62- req = params . requireds . map { |n | n . is_a? ( Prism ::MultiTargetNode ) ? nil : n . name }
63+ req = params . requireds . each_with_index . map do |n , i |
64+ if n . is_a? ( Prism ::MultiTargetNode )
65+ @block_multi_targets [ i ] = n
66+ nil
67+ else
68+ n . name
69+ end
70+ end
6371 opt = params . optionals . map { |n | n . name }
6472 req + opt
6573 when Prism ::NumberedParametersNode
@@ -89,6 +97,7 @@ def initialize(raw_node, recv, mid, mid_code_range, raw_args, last_arg, raw_bloc
8997 attr_reader :recv , :mid , :mid_code_range , :yield
9098 attr_reader :positional_args , :splat_flags , :keyword_args
9199 attr_reader :block_tbl , :block_f_args , :block_opt_positional_defaults , :block_body , :block_pass , :anonymous_block_forwarding
100+ attr_reader :block_multi_targets
92101 attr_reader :safe_navigation
93102
94103 def subnodes = { recv :, positional_args :, keyword_args :, block_opt_positional_defaults :, block_body :, block_pass : }
@@ -133,6 +142,16 @@ def install0(genv)
133142 end
134143 end
135144
145+ if @block_multi_targets
146+ @block_multi_targets . each do |idx , raw_multi_target |
147+ param_vtx = blk_f_args [ idx ]
148+ lefts = raw_multi_target . lefts . map do |n |
149+ block_body . lenv . new_var ( n . is_a? ( Prism ::MultiTargetNode ) ? nil : n . name , self )
150+ end
151+ @changes . add_masgn_box ( genv , param_vtx , lefts , nil , nil )
152+ end
153+ end
154+
136155 @lenv . locals . each do |var , vtx |
137156 block_body . lenv . set_var ( var , vtx )
138157 end
0 commit comments