Sha256: 04e89967f996394726839e6372c2c22ee15463d94d6e10459e1a025c53928534

Contents?: true

Size: 1.73 KB

Versions: 2

Compression:

Stored size: 1.73 KB

Contents

module Yoda
  module Typing
    module Tree
      module MethodInferable
        # @param receiver_type [Types::Type]
        # @return [Types::Type]
        def infer_method_type(receiver_type:)
          value_resolve_context = generator.value_resolve_context(self_type: receiver_type)

          method_candidates = receiver_type.value.select_method(node_name.to_s, visibility: %i(private protected public))
          method_types = method_candidates.map(&:rbs_type).map { |type| value_resolve_context.wrap(type) }

          # TODO: Support overloads
          method_bind = method_types.reduce({}) do |all_bind, method_type|
            bind = Inferencer::ParameterBinder.new(parameters_node.parameter).bind(type: method_type, generator: generator)
            all_bind.merge(bind.to_h) { |_key, v1, v2| generator.union_type(v1, v2) }
          end

          Logger.trace("method_candidates: [#{method_candidates.join(', ')}]")
          Logger.trace("bind arguments: #{method_bind.map { |key, value| [key, value.to_s] }.to_h }")

          bind_method_definition(node: node, method_candidates: method_candidates)

          method_context = context.derive_method_context(receiver_type: receiver_type, binds: method_bind)

          infer_child(body_node, context: method_context)

          generator.symbol_type(node_name.to_sym)
        end

        # @abstract
        # @return [Symbol, string]
        def node_name
          fail NotImplementedError
        end

        # @abstract
        # @return [AST::ParametersNode]
        def parameters_node
          fail NotImplementedError
        end

        # @abstract
        # @return [AST::ParametersNode]
        def body_node
          fail NotImplementedError
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
yoda-language-server-0.10.1 lib/yoda/typing/tree/method_inferable.rb
yoda-language-server-0.10.0 lib/yoda/typing/tree/method_inferable.rb