Skip to content
Open
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
33 changes: 24 additions & 9 deletions lib/typeprof/core/ast/call.rb
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ def initialize(raw_node, recv, mid, mid_code_range, raw_args, last_arg, raw_bloc
args << raw_arg.expression
@splat_flags << true
when Prism::ForwardingArgumentsNode
@forwarding_arguments = true
@forwarding_arguments = :rest
else
args << raw_arg
@splat_flags << false
Expand Down Expand Up @@ -113,10 +113,22 @@ def install0(genv)
end

if @forwarding_arguments
forward_a_args = (@lenv.forward_args || raise).to_actual_arguments(genv, @changes, self)
positional_args = forward_a_args.positionals
splat_flags = forward_a_args.splat_flags
keyword_args = forward_a_args.keywords
forward_a_args = (@lenv.forward_args || raise).to_actual_arguments(
genv,
@changes,
self,
include_leading_positionals: @forwarding_arguments != :rest,
activation_required: @forwarding_arguments == :rest,
)
leading_args = @positional_args.map do |arg|
if arg.is_a?(DummyNilNode)
@lenv.get_var(:"*anonymous_rest")
else
arg.install(genv)
end
end
a_args = forward_a_args.prepend_positionals(leading_args, @splat_flags)
a_args = a_args.with_keywords(@keyword_args.install(genv)) if @keyword_args
else
positional_args = @positional_args.map do |arg|
if arg.is_a?(DummyNilNode)
Expand All @@ -125,8 +137,7 @@ def install0(genv)
arg.install(genv)
end
end
splat_flags = @splat_flags
keyword_args = @keyword_args ? @keyword_args.install(genv) : nil
a_args = ActualArguments.new(positional_args, @splat_flags, @keyword_args ? @keyword_args.install(genv) : nil, nil)
end

if @block_body
Expand Down Expand Up @@ -198,7 +209,11 @@ def install0(genv)
blk_ty = forward_a_args.block
end

a_args = ActualArguments.new(positional_args, splat_flags, keyword_args, blk_ty)
if @forwarding_arguments
a_args = a_args.with_block(blk_ty, omittable: !@block_body && !@block_pass && !@anonymous_block_forwarding)
else
a_args = a_args.with_block(blk_ty)
end
box = @changes.add_method_call_box(genv, recv, @mid, a_args, !@recv)

block_body = @block_body
Expand Down Expand Up @@ -317,7 +332,7 @@ class ForwardingSuperNode < CallBaseNode
def initialize(raw_node, lenv)
raw_args = nil
raw_block = raw_node.block
super(raw_node, nil, :"*super", nil, raw_args, nil, raw_block, lenv, forwarding_arguments: true)
super(raw_node, nil, :"*super", nil, raw_args, nil, raw_block, lenv, forwarding_arguments: :all)
end
end

Expand Down
19 changes: 10 additions & 9 deletions lib/typeprof/core/ast/method.rb
Original file line number Diff line number Diff line change
Expand Up @@ -271,21 +271,22 @@ def install0(genv)
block = @body.lenv.new_var(:"*given_block", self)
end

forward_opt_positionals = @opt_positionals.map do
elem_vtx = Vertex.new(self)
[Source.new(genv.gen_ary_type(elem_vtx)), elem_vtx]
end
forward_opt_positionals = @opt_positionals.map { Vertex.new(self) }
forward_rest_positionals = @rest_positionals ? Vertex.new(self) : nil
forward_opt_keywords = @opt_keywords.map {|_name| Vertex.new(self) }
forward_rest_keywords = @rest_keywords ? Vertex.new(self) : nil
forward_block = Vertex.new(self)
forward_activation = Vertex.new(self)
@body.lenv.forward_args = ForwardingArguments.new(
req_positionals,
forward_opt_positionals.map(&:first),
forward_opt_positionals.map(&:last),
rest_positionals,
forward_opt_positionals,
forward_rest_positionals,
post_positionals,
@req_keywords.zip(req_keywords),
@opt_keywords.zip(forward_opt_keywords),
rest_keywords,
block,
forward_rest_keywords,
forward_block,
forward_activation,
)

if @body
Expand Down
Loading
Loading