diff --git a/lib/tapioca/gem/listeners/sorbet_signatures.rb b/lib/tapioca/gem/listeners/sorbet_signatures.rb index 1fc658b19..4a64dd0a5 100644 --- a/lib/tapioca/gem/listeners/sorbet_signatures.rb +++ b/lib/tapioca/gem/listeners/sorbet_signatures.rb @@ -16,7 +16,12 @@ def on_method(event) signature = event.signature return unless signature - event.node.sigs << compile_signature(signature, event.parameters) + sig = compile_signature(signature, event.parameters) + # `initialize` must always return void. When a sig uses `.void.checked(:tests)`, + # Sorbet introspects the return type as `T.anything` outside of test mode, so we + # correct it here. + sig.return_type = "void" if event.node.name == "initialize" + event.node.sigs << sig end #: (untyped signature, Array[[Symbol, String]] parameters) -> RBI::Sig diff --git a/spec/tapioca/gem/pipeline_spec.rb b/spec/tapioca/gem/pipeline_spec.rb index 997ff982e..58ab969f4 100644 --- a/spec/tapioca/gem/pipeline_spec.rb +++ b/spec/tapioca/gem/pipeline_spec.rb @@ -2225,6 +2225,28 @@ def initialize; end assert_equal(output, compile) end + it "compiles initialize with void sig using checked(:tests)" do + add_ruby_file("bar.rb", <<~RUBY) + class Bar + extend T::Sig + + sig { params(x: Integer).void.checked(:tests) } + def initialize(x) + @x = x + end + end + RUBY + + output = template(<<~RBI) + class Bar + sig { params(x: ::Integer).void } + def initialize(x); end + end + RBI + + assert_equal(output, compile) + end + it "understands redefined attr_accessor" do add_ruby_file("toto.rb", <<~RUBY) class Toto