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
25 changes: 16 additions & 9 deletions lib/typeprof/core/ast/call.rb
Original file line number Diff line number Diff line change
Expand Up @@ -60,17 +60,24 @@ def initialize(raw_node, recv, mid, mid_code_range, raw_args, last_arg, raw_bloc
@block_multi_targets = {}
@block_f_args = case raw_block.parameters
when Prism::BlockParametersNode
# `{ || ... }` (empty pipes) and `{ |; x| ... }`
# (block-local-only) yield BlockParametersNode
# whose inner `parameters` is nil.
params = raw_block.parameters.parameters
req = params.requireds.each_with_index.map do |n, i|
if n.is_a?(Prism::MultiTargetNode)
@block_multi_targets[i] = n
nil
else
n.name
if params
req = params.requireds.each_with_index.map do |n, i|
if n.is_a?(Prism::MultiTargetNode)
@block_multi_targets[i] = n
nil
else
n.name
end
end
opt = params.optionals.map {|n| n.name }
req + opt
else
[]
end
opt = params.optionals.map {|n| n.name }
req + opt
when Prism::NumberedParametersNode
1.upto(raw_block.parameters.maximum).map { |n| :"_#{n}" }
when Prism::ItParametersNode
Expand All @@ -83,7 +90,7 @@ def initialize(raw_node, recv, mid, mid_code_range, raw_args, last_arg, raw_bloc
ncref = CRef.new(lenv.cref.cpath, :instance, @mid, lenv.cref)
nlenv = LocalEnv.new(@lenv.file_context, ncref, {}, @lenv.return_boxes)
@block_opt_positional_defaults = []
if raw_block.parameters.is_a?(Prism::BlockParametersNode)
if raw_block.parameters.is_a?(Prism::BlockParametersNode) && raw_block.parameters.parameters
raw_block.parameters.parameters.optionals.each do |n|
@block_opt_positional_defaults << AST.create_node(n.value, nlenv)
end
Expand Down
13 changes: 13 additions & 0 deletions scenario/regressions/empty-block-parameters.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
## update
def call_block(&b)
b.call
end

call_block { || 42 }

call_block { |; x| x = 42; x }

## assert
class Object
def call_block: { () -> Integer } -> Integer
end
Loading