Class: Yoda::Typing::Inferencer::MethodResolver

Inherits:
Object
  • Object
show all
Defined in:
lib/yoda/typing/inferencer/method_resolver.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(registry:, receiver_type:, argument_types:, name:, generator:, implicit_receiver: false) ⇒ MethodResolver

Returns a new instance of MethodResolver.

Parameters:



29
30
31
32
33
34
35
36
# File 'lib/yoda/typing/inferencer/method_resolver.rb', line 29

def initialize(registry:, receiver_type:, argument_types:, name:, generator:, implicit_receiver: false)
  @registry = registry
  @receiver_type = receiver_type
  @argument_type = argument_types
  @name = name
  @generator = generator
  @implicit_receiver = implicit_receiver
end

Instance Attribute Details

#argument_typesArray<Types::Base> (readonly)

Returns:



12
13
14
# File 'lib/yoda/typing/inferencer/method_resolver.rb', line 12

def argument_types
  @argument_types
end

#generatorTypes::Generator (readonly)

Returns:



18
19
20
# File 'lib/yoda/typing/inferencer/method_resolver.rb', line 18

def generator
  @generator
end

#implicit_receivertrue, false (readonly)

Returns:

  • (true, false)


21
22
23
# File 'lib/yoda/typing/inferencer/method_resolver.rb', line 21

def implicit_receiver
  @implicit_receiver
end

#nameString (readonly)

Returns:

  • (String)


15
16
17
# File 'lib/yoda/typing/inferencer/method_resolver.rb', line 15

def name
  @name
end

#receiver_typeTypes::Base (readonly)

Returns:



9
10
11
# File 'lib/yoda/typing/inferencer/method_resolver.rb', line 9

def receiver_type
  @receiver_type
end

#registryStore::Registry (readonly)

Returns:



6
7
8
# File 'lib/yoda/typing/inferencer/method_resolver.rb', line 6

def registry
  @registry
end

Instance Method Details

#generate_block_context(context:, block_param_node:) ⇒ Contexts::BaseContext

Generate block context for the candidate

Parameters:

Returns:



42
43
44
45
46
# File 'lib/yoda/typing/inferencer/method_resolver.rb', line 42

def generate_block_context(context:, block_param_node:)
  binds = ArgumentsBinder.new(generator: generator).bind(types: method_types, arguments: block_param_node.parameter)

  Contexts::BlockContext.new(parent: context, registry: registry, receiver: context.receiver, binds: binds)
end

#method_candidatesArray<FunctionSignatures::Base>

Returns:

  • (Array<FunctionSignatures::Base>)


61
62
63
64
65
# File 'lib/yoda/typing/inferencer/method_resolver.rb', line 61

def method_candidates
  @method_candidates ||=
    Store::Query::FindSignature.new(registry)
                               .select_on_multiple(receiver_candidates, name.to_s, visibility: implicit_receiver ? %i(private protected public) : %i(public))
end

#method_typesArray<Types::Function>

Returns:



56
57
58
# File 'lib/yoda/typing/inferencer/method_resolver.rb', line 56

def method_types
  @method_types ||= method_candidates.map(&:type).map { |type| converter.convert_from_expression(type) }
end

#receiver_candidatesArray<Store::Objects::NamespaceObject>



68
69
70
# File 'lib/yoda/typing/inferencer/method_resolver.rb', line 68

def receiver_candidates
  @receiver_candidates ||= ObjectResolver.new(registry: registry, generator: generator).call(receiver_type)
end

#return_typeTypes::Base

Returns:



49
50
51
52
53
# File 'lib/yoda/typing/inferencer/method_resolver.rb', line 49

def return_type
  @return_type ||= begin
    Types::Union.new(*method_candidates.map(&:type).map(&:return_type).map { |type| converter.convert_from_expression(type) })
  end
end