Class: Yoda::Typing::Inferencer::MethodResolver
- Inherits:
-
Object
- Object
- Yoda::Typing::Inferencer::MethodResolver
- Defined in:
- lib/yoda/typing/inferencer/method_resolver.rb
Instance Attribute Summary collapse
- #argument_types ⇒ Array<Types::Base> readonly
- #generator ⇒ Types::Generator readonly
- #implicit_receiver ⇒ true, false readonly
- #name ⇒ String readonly
- #receiver_type ⇒ Types::Base readonly
- #registry ⇒ Store::Registry readonly
Instance Method Summary collapse
-
#generate_block_context(context:, block_param_node:) ⇒ Contexts::BaseContext
Generate block context for the candidate.
-
#initialize(registry:, receiver_type:, argument_types:, name:, generator:, implicit_receiver: false) ⇒ MethodResolver
constructor
A new instance of MethodResolver.
- #method_candidates ⇒ Array<FunctionSignatures::Base>
- #method_types ⇒ Array<Types::Function>
- #receiver_candidates ⇒ Array<Store::Objects::NamespaceObject>
- #return_type ⇒ Types::Base
Constructor Details
#initialize(registry:, receiver_type:, argument_types:, name:, generator:, implicit_receiver: false) ⇒ MethodResolver
Returns a new instance of MethodResolver.
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_types ⇒ Array<Types::Base> (readonly)
12 13 14 |
# File 'lib/yoda/typing/inferencer/method_resolver.rb', line 12 def argument_types @argument_types end |
#generator ⇒ Types::Generator (readonly)
18 19 20 |
# File 'lib/yoda/typing/inferencer/method_resolver.rb', line 18 def generator @generator end |
#implicit_receiver ⇒ true, false (readonly)
21 22 23 |
# File 'lib/yoda/typing/inferencer/method_resolver.rb', line 21 def implicit_receiver @implicit_receiver end |
#name ⇒ String (readonly)
15 16 17 |
# File 'lib/yoda/typing/inferencer/method_resolver.rb', line 15 def name @name end |
#receiver_type ⇒ Types::Base (readonly)
9 10 11 |
# File 'lib/yoda/typing/inferencer/method_resolver.rb', line 9 def receiver_type @receiver_type end |
#registry ⇒ Store::Registry (readonly)
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
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_candidates ⇒ 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_types ⇒ Array<Types::Function>
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_candidates ⇒ Array<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_type ⇒ Types::Base
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 |