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
8 changes: 7 additions & 1 deletion lib/typeprof/core/ast/method.rb
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ def self.parse_params(tbl, raw_args, lenv)
opt_keywords: [],
opt_keyword_defaults: [],
rest_keywords: nil,
no_keywords: false,
block: nil,
}
end
Expand Down Expand Up @@ -64,6 +65,7 @@ def self.parse_params(tbl, raw_args, lenv)
req_keywords = []
opt_keywords = []
opt_keyword_defaults = []
no_keywords = false

raw_args.keywords.each do |kw|
case kw.type
Expand All @@ -83,7 +85,7 @@ def self.parse_params(tbl, raw_args, lenv)
rest_positionals = :"..."
rest_keywords = :"..."
when Prism::NoKeywordsParameterNode
# what to do?
no_keywords = true
when nil
# nothing to do
else
Expand All @@ -102,6 +104,7 @@ def self.parse_params(tbl, raw_args, lenv)
opt_keywords:,
opt_keyword_defaults:,
rest_keywords:,
no_keywords:,
block:,
args_code_ranges:
}
Expand Down Expand Up @@ -144,6 +147,7 @@ def initialize(raw_node, lenv, use_result)
@opt_keywords = h[:opt_keywords]
@opt_keyword_defaults = h[:opt_keyword_defaults]
@rest_keywords = h[:rest_keywords]
@no_keywords = h[:no_keywords]
@block = h[:block]
@args_code_ranges = h[:args_code_ranges] || []

Expand All @@ -163,6 +167,7 @@ def initialize(raw_node, lenv, use_result)
attr_reader :opt_keywords
attr_reader :opt_keyword_defaults
attr_reader :rest_keywords
attr_reader :no_keywords
attr_reader :block
attr_reader :body
attr_reader :rbs_method_type
Expand All @@ -186,6 +191,7 @@ def attrs = {
req_keywords:,
opt_keywords:,
rest_keywords:,
no_keywords:,
block:,
reusable:,
}
Expand Down
11 changes: 11 additions & 0 deletions lib/typeprof/core/env/method.rb
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,17 @@ def new_vertexes(genv, node)
ActualArguments.new(positionals, splat_flags, keywords, block)
end

def with_keywords_as_last_positional_hash
return self unless @keywords

ActualArguments.new(
@positionals + [@keywords],
@splat_flags + [false],
nil,
@block
)
end

def get_rest_args(genv, changes, start_rest, end_rest)
vtxs = []

Expand Down
11 changes: 11 additions & 0 deletions lib/typeprof/core/graph/box.rb
Original file line number Diff line number Diff line change
Expand Up @@ -491,6 +491,8 @@ def run0(genv, changes)
end

def pass_arguments(changes, genv, a_args)
a_args = normalize_keyword_hash_argument_for_def(a_args)

if a_args.splat_flags.any?
# there is at least one splat actual argument

Expand Down Expand Up @@ -607,6 +609,15 @@ def pass_arguments(changes, genv, a_args)
return true
end

def normalize_keyword_hash_argument_for_def(a_args)
return a_args unless a_args.keywords
return a_args if @node.no_keywords
return a_args if @node.rest_keywords
return a_args unless @node.req_keywords.empty? && @node.opt_keywords.empty?

a_args.with_keywords_as_last_positional_hash
end

def call(changes, genv, a_args, ret)
if pass_arguments(changes, genv, a_args)
changes.add_edge(genv, a_args.block, @f_args.block) if @f_args.block && a_args.block
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@ def foo(a)

## assert
class Object
def foo: (Hash[:x, Integer]) -> Hash[:x, Integer]
def foo: ({ x: Integer }) -> { x: Integer }
end