Skip to content

Commit 9cfad36

Browse files
committed
Support anonymous block forwarding
1 parent 6fb5f4a commit 9cfad36

3 files changed

Lines changed: 13 additions & 7 deletions

File tree

lib/typeprof/core/ast/call.rb

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ def initialize(raw_node, recv, mid, mid_code_range, raw_args, last_arg, raw_bloc
1818
@block_f_args = nil
1919
@block_body = nil
2020
@safe_navigation = raw_node.respond_to?(:safe_navigation?) && raw_node.safe_navigation?
21+
@anonymous_block_forwarding = false
2122

2223
if raw_args
2324
args = []
@@ -45,8 +46,11 @@ def initialize(raw_node, recv, mid, mid_code_range, raw_args, last_arg, raw_bloc
4546

4647
if raw_block
4748
if raw_block.type == :block_argument_node
48-
# TODO: Support anonymous block forwarding
49-
@block_pass = AST.create_node(raw_block.expression, lenv) if raw_block.expression
49+
if raw_block.expression
50+
@block_pass = AST.create_node(raw_block.expression, lenv)
51+
else
52+
@anonymous_block_forwarding = true
53+
end
5054
else
5155
@block_pass = nil
5256
@block_tbl = raw_block.locals
@@ -74,11 +78,11 @@ def initialize(raw_node, recv, mid, mid_code_range, raw_args, last_arg, raw_bloc
7478

7579
attr_reader :recv, :mid, :mid_code_range, :yield
7680
attr_reader :positional_args, :splat_flags, :keyword_args
77-
attr_reader :block_tbl, :block_f_args, :block_body, :block_pass
81+
attr_reader :block_tbl, :block_f_args, :block_body, :block_pass, :anonymous_block_forwarding
7882
attr_reader :safe_navigation
7983

8084
def subnodes = { recv:, positional_args:, keyword_args:, block_body:, block_pass: }
81-
def attrs = { mid:, splat_flags:, block_tbl:, block_f_args:, yield:, safe_navigation: }
85+
def attrs = { mid:, splat_flags:, block_tbl:, block_f_args:, yield:, safe_navigation:, anonymous_block_forwarding: }
8286

8387
def install0(genv)
8488
recv = @recv ? @recv.install(genv) : @yield ? @lenv.get_var(:"*given_block") : @lenv.get_var(:"*self")
@@ -133,6 +137,8 @@ def install0(genv)
133137
blk_ty = Source.new(Type::Proc.new(genv, block))
134138
elsif @block_pass
135139
blk_ty = @block_pass.install(genv)
140+
elsif @anonymous_block_forwarding
141+
blk_ty = @lenv.get_var(:"*anonymous_block")
136142
end
137143

138144
a_args = ActualArguments.new(positional_args, @splat_flags, keyword_args, blk_ty)

lib/typeprof/core/ast/method.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ def self.parse_params(tbl, raw_args, lenv)
9595
raise "unexpected keyword rest: #{ raw_args.keyword_rest.class }"
9696
end
9797

98-
block = raw_args.block.name if raw_args.block
98+
block = raw_args.block.name || :"*anonymous_block" if raw_args.block
9999

100100
{
101101
req_positionals:,

scenario/block/anonymous_block_forwarding.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ def bar(&b)
1313

1414
## assert
1515
class Object
16-
def foo: -> untyped
17-
def bar: { (Float) -> untyped } -> untyped
16+
def foo: { (Float) -> String } -> String
17+
def bar: { (Float) -> String } -> String
1818
end

0 commit comments

Comments
 (0)