diff --git a/lib/typeprof/core/ast/call.rb b/lib/typeprof/core/ast/call.rb index a2e97728..cad2ba65 100644 --- a/lib/typeprof/core/ast/call.rb +++ b/lib/typeprof/core/ast/call.rb @@ -139,7 +139,11 @@ def install0(genv) end blk_f_ary_arg = Vertex.new(self) - @changes.add_masgn_box(genv, blk_f_ary_arg, blk_f_args, nil, nil) # TODO: support splat "do |a, *b, c|" + # TODO: support splat "do |a, *b, c|" + blk_f_args.each_with_index do |f_arg, i| + elem_vtx = @changes.add_splat_box(genv, blk_f_ary_arg, i).ret + @changes.add_edge(genv, elem_vtx, f_arg) + end block = Block.new(self, blk_f_ary_arg, blk_f_args, @block_body.lenv.next_boxes) blk_ty = Source.new(Type::Proc.new(genv, block)) elsif @block_pass diff --git a/lib/typeprof/core/env/method.rb b/lib/typeprof/core/env/method.rb index 237bbc03..4eb8bc0b 100644 --- a/lib/typeprof/core/env/method.rb +++ b/lib/typeprof/core/env/method.rb @@ -94,12 +94,7 @@ def initialize(node, f_ary_arg, f_args, next_boxes) def accept_args(genv, changes, caller_positionals) if caller_positionals.size == 1 && @f_args.size >= 2 - single_arg = caller_positionals[0] - - @f_args.each_with_index do |f_arg, i| - elem_vtx = changes.add_splat_box(genv, single_arg, i).ret - changes.add_edge(genv, elem_vtx, f_arg) - end + changes.add_edge(genv, caller_positionals[0], @f_ary_arg) else caller_positionals.zip(@f_args) do |a_arg, f_arg| changes.add_edge(genv, a_arg, f_arg) if f_arg diff --git a/scenario/block/sort_by_multi_param.rb b/scenario/block/sort_by_multi_param.rb new file mode 100644 index 00000000..b478a414 --- /dev/null +++ b/scenario/block/sort_by_multi_param.rb @@ -0,0 +1,51 @@ +## update +def foo + { a: 1 }.sort_by do |key_value| + key_value + end +end + +def bar + { a: 1 }.sort_by do |key, value| + key + end +end + +def baz + { a: 1 }.sort_by do |(key, value)| + key + end +end + +## assert +class Object + def foo: -> Array[[:a, Integer]] + def bar: -> Array[[:a, Integer]] + def baz: -> Array[[:a, Integer]] +end + +## update +def foo + { 'a' => 1 }.sort_by do |key_value| + key_value + end +end + +def bar + { 'a' => 1 }.sort_by do |key, value| + key + end +end + +def baz + { 'a' => 1 }.sort_by do |(key, value)| + key + end +end + +## assert +class Object + def foo: -> Array[[String, Integer]] + def bar: -> Array[[String, Integer]] + def baz: -> Array[[String, Integer]] +end