Skip to content

Evaluate lazy signatures hidden by prepended methods - #2709

Open
KaanOzkan wants to merge 1 commit into
mainfrom
ko-evaluate-lazy-signatures
Open

Evaluate lazy signatures hidden by prepended methods#2709
KaanOzkan wants to merge 1 commit into
mainfrom
ko-evaluate-lazy-signatures

Conversation

@KaanOzkan

@KaanOzkan KaanOzkan commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Motivation

Fixes #2710

When prepend places a wrapper before a method whose sig remains
pending, looking up the wrapper returns no signature.

module Wrapper
  def call(...) = super
end

class Foo
  extend T::Sig

  sig { params(value: String).returns(String) }
  def call(value) = value

  prepend Wrapper
end

method = Foo.instance_method(:call)

# Before: signature_of(method) # => nil
# After:  signature_of(method) # => Foo#call signature

Implementation

Query the underlying method to evaluate the pending sig using T::Utils.signature_forMethod, then query the wrapper again after sorbet-runtime associates the signature with it.

Tests

On top of automated tests, tested on Core

@KaanOzkan
KaanOzkan force-pushed the ko-evaluate-lazy-signatures branch from de2ffad to a80a075 Compare September 1, 2026 13:42
@KaanOzkan KaanOzkan changed the title Trigger lazy signatures hidden by prepended methods Evaluate lazy signatures hidden by prepended methods Sep 2, 2026
@KaanOzkan
KaanOzkan force-pushed the ko-evaluate-lazy-signatures branch from a80a075 to cabcc8d Compare September 2, 2026 13:23
@KaanOzkan
KaanOzkan force-pushed the ko-evaluate-lazy-signatures branch 2 times, most recently from 01d271e to 0b88b2a Compare September 2, 2026 13:50
When `prepend` places a wrapper before a method whose `sig` remains
pending, looking up the wrapper returns no signature. Query the
underlying method to evaluate the pending `sig`, then query the wrapper
again after Sorbet Runtime associates the signature with it.

    module Wrapper
      def call(...) = super
    end

    class Foo
      extend T::Sig

      sig { params(value: String).returns(String) }
      def call(value) = value

      prepend Wrapper
    end

    method = Foo.instance_method(:call)

    # Before: signature_of(method) # => nil
    # After:  signature_of(method) # => signature with (String) -> String
@KaanOzkan
KaanOzkan force-pushed the ko-evaluate-lazy-signatures branch from 0b88b2a to bf8b85e Compare September 2, 2026 13:56
@KaanOzkan
KaanOzkan marked this pull request as ready for review September 2, 2026 15:00
@KaanOzkan
KaanOzkan requested a review from a team as a code owner September 2, 2026 15:00
@KaanOzkan
KaanOzkan requested a review from amomchilov September 2, 2026 15:02
@vinistock

Copy link
Copy Markdown
Member

Out of curiosity, what happens if the prepended method doesn't match the arity of the super method?

module Wrapper
  def foo(a, b, c)
    super(a + b, c)
  end
end

class Bar
  prepend Wrapper

  #: (Integer, Integer) -> Integer
  def foo(a, b)
    a + b
  end
end

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Filtered DSL generation misses lazy signatures hidden by prepend

2 participants