Skip to content

Commit c9c1f4c

Browse files
committed
Support destructuring parameters in block arguments
This allows `do |x, (y, z)|`.
1 parent 4b086e3 commit c9c1f4c

2 files changed

Lines changed: 24 additions & 1 deletion

File tree

lib/typeprof/core/ast/call.rb

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

scenario/known-issues/multi_target_block_arg.rb renamed to scenario/block/multi_target_block_arg.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,7 @@ def check
1111
end
1212

1313
## assert
14+
class Object
15+
def yield_values: { (Integer, [Float, String]) -> bot } -> bot
16+
def check: -> [Integer, Float, String]?
17+
end

0 commit comments

Comments
 (0)