Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion lib/typeprof/core/ast/call.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
7 changes: 1 addition & 6 deletions lib/typeprof/core/env/method.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
51 changes: 51 additions & 0 deletions scenario/block/sort_by_multi_param.rb
Original file line number Diff line number Diff line change
@@ -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