Class: Rigor::Type::BoundMethod

Inherits:
Object
  • Object
show all
Includes:
AcceptanceRouter, ValueSemantics
Defined in:
lib/rigor/type/bound_method.rb

Overview

A ‘Method` carrier that tracks the bound `(receiver, name)` pair.

Ruby’s ‘Object#method(name)` returns a `Method` instance whose later `.call` / `.()` / `[]` dispatches `name` on the original receiver. The plain RBS `Method` nominal cannot carry that binding, so call sites on the resulting `Method` collapse to `untyped` — losing the per-method precision the original receiver supports.

‘BoundMethod` keeps the binding so the dispatcher can substitute the original `(receiver, name)` dispatch at `.call` / `.()` / `[]` time. The carrier erases to `Method` at the RBS boundary so downstream RBS interop (e.g. passing the value into a method whose parameter is typed `::Method`) stays compatible — the binding is only consulted when Rigor itself dispatches.

See ‘lib/rigor/inference/method_dispatcher/method_folding.rb` for the forward (`Object#method(:sym)`) and backward (`BoundMethod#call`) folding tiers that consume / produce this carrier.

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from ValueSemantics

included

Methods included from AcceptanceRouter

#accepts

Constructor Details

#initialize(receiver_type:, method_name:) ⇒ BoundMethod

Returns a new instance of BoundMethod.

Raises:

  • (ArgumentError)


32
33
34
35
36
37
38
39
# File 'lib/rigor/type/bound_method.rb', line 32

def initialize(receiver_type:, method_name:)
  raise ArgumentError, "receiver_type must not be nil" if receiver_type.nil?
  raise ArgumentError, "method_name must be a Symbol, got #{method_name.inspect}" unless method_name.is_a?(Symbol)

  @receiver_type = receiver_type
  @method_name = method_name
  freeze
end

Instance Attribute Details

#method_nameObject (readonly)

Returns the value of attribute method_name.



30
31
32
# File 'lib/rigor/type/bound_method.rb', line 30

def method_name
  @method_name
end

#receiver_typeObject (readonly)

Returns the value of attribute receiver_type.



30
31
32
# File 'lib/rigor/type/bound_method.rb', line 30

def receiver_type
  @receiver_type
end

Instance Method Details

#botObject



53
54
55
# File 'lib/rigor/type/bound_method.rb', line 53

def bot
  Trinary.no
end

#describe(verbosity = :short) ⇒ Object



41
42
43
# File 'lib/rigor/type/bound_method.rb', line 41

def describe(verbosity = :short)
  "Method<#{receiver_type.describe(verbosity)}##{method_name}>"
end

#dynamicObject



57
58
59
# File 'lib/rigor/type/bound_method.rb', line 57

def dynamic
  Trinary.no
end

#erase_to_rbsObject



45
46
47
# File 'lib/rigor/type/bound_method.rb', line 45

def erase_to_rbs
  "Method"
end

#inspectObject



67
68
69
# File 'lib/rigor/type/bound_method.rb', line 67

def inspect
  "#<Rigor::Type::BoundMethod #{describe(:short)}>"
end

#topObject



49
50
51
# File 'lib/rigor/type/bound_method.rb', line 49

def top
  Trinary.no
end