diff --git a/lib/rbi/rbs_printer.rb b/lib/rbi/rbs_printer.rb index 4bd3b8cb..4153cd31 100644 --- a/lib/rbi/rbs_printer.rb +++ b/lib/rbi/rbs_printer.rb @@ -949,6 +949,12 @@ def visit_proc(type) end @string << ") " end + proc_bind = type.proc_bind + if proc_bind + @string << "[self: " + visit(proc_bind) + @string << "] " + end @string << "-> " visit(type.proc_returns) end diff --git a/test/rbi/rbs_printer_test.rb b/test/rbi/rbs_printer_test.rb index 4bcbeb26..89e8bc00 100644 --- a/test/rbi/rbs_printer_test.rb +++ b/test/rbi/rbs_printer_test.rb @@ -530,6 +530,32 @@ def foo: -> instance RBI end + def test_print_procs + rbi = parse_rbi(<<~RBI) + sig { params(x: T.nilable(T.proc.void)) } + def proc1(x); end + + sig { params(x: T.proc.bind(T.untyped).void) } + def proc2(x); end + + sig { params(block: T.nilable(T.proc.void)) } + def block1(&block); end + + sig { params(block: T.proc.bind(T.untyped).void) } + def block2(&block); end + RBI + + assert_equal(<<~RBI, rbi.rbs_string) + def proc1: ((^-> void)? x) -> void + + def proc2: (^[self: untyped] -> void x) -> void + + def block1: ?{ -> void } -> void + + def block2: { [self: untyped] -> void } -> void + RBI + end + def test_print_t_structs rbi = parse_rbi(<<~RBI) class Foo < T::Struct; end