class TypeProf::Core::MethodDeclBox

Attributes

cpath[R]
method_types[R]
mid[R]
node[RW]
overloading[R]
ret[R]
singleton[R]

Public Class Methods

new(node, genv, cpath, singleton, mid, method_types, overloading) click to toggle source
Calls superclass method TypeProf::Core::Box::new
# File typeprof-0.30.1/lib/typeprof/core/graph/box.rb, line 96
def initialize(node, genv, cpath, singleton, mid, method_types, overloading)
  super(node)
  @cpath = cpath
  @singleton = singleton
  @mid = mid
  @method_types = method_types
  @overloading = overloading
  @ret = Source.new

  me = genv.resolve_method(@cpath, @singleton, @mid)
  me.add_decl(self)
  me.add_run_all_method_call_boxes(genv)
  me.add_run_all_mdefs(genv)
end

Public Instance Methods

destroy(genv) click to toggle source
# File typeprof-0.30.1/lib/typeprof/core/graph/box.rb, line 115
def destroy(genv)
  me = genv.resolve_method(@cpath, @singleton, @mid)
  me.remove_decl(self)
  me.add_run_all_method_call_boxes(genv)
end
match_arguments?(genv, changes, param_map, a_args, method_type) click to toggle source
# File typeprof-0.30.1/lib/typeprof/core/graph/box.rb, line 121
def match_arguments?(genv, changes, param_map, a_args, method_type)
  # TODO: handle a tuple as a splat argument?
  if a_args.splat_flags.any?
    return false unless method_type.rest_positionals
    method_type.req_positionals.size.times do |i|
      return false if a_args.splat_flags[i]
    end
    method_type.post_positionals.size.times do |i|
      return false if a_args.splat_flags[-i - 1]
    end
  else
    actual = a_args.positionals.size
    required_formal = method_type.req_positionals.size + method_type.post_positionals.size
    if actual < required_formal
      # too few actual arguments
      return false
    end
    if !method_type.rest_positionals && actual > required_formal + method_type.opt_positionals.size
      # too many actual arguments
      return false
    end
  end

  method_type.req_positionals.each_with_index do |ty, i|
    f_arg = ty.contravariant_vertex(genv, changes, param_map)
    return false unless a_args.positionals[i].check_match(genv, changes, f_arg)
  end
  method_type.post_positionals.each_with_index do |ty, i|
    f_arg = ty.contravariant_vertex(genv, changes, param_map)
    i -= method_type.post_positionals.size
    return false unless a_args.positionals[i].check_match(genv, changes, f_arg)
  end

  start_rest = method_type.req_positionals.size
  end_rest = a_args.positionals.size - method_type.post_positionals.size

  i = 0
  while i < method_type.opt_positionals.size && start_rest < end_rest
    break if a_args.splat_flags[start_rest]
    f_arg = method_type.opt_positionals[i].contravariant_vertex(genv, changes, param_map)
    return false unless a_args.positionals[start_rest].check_match(genv, changes, f_arg)
    i += 1
    start_rest += 1
  end

  if start_rest < end_rest
    vtxs = a_args.get_rest_args(genv, start_rest, end_rest)
    while i < method_type.opt_positionals.size
      f_arg = method_type.opt_positionals[i].contravariant_vertex(genv, changes, param_map)
      return false if vtxs.any? {|vtx| !vtx.check_match(genv, changes, f_arg) }
      i += 1
    end
    if method_type.rest_positionals
      f_arg = method_type.rest_positionals.contravariant_vertex(genv, changes, param_map)
      return false if vtxs.any? {|vtx| !vtx.check_match(genv, changes, f_arg) }
    end
  end

  return true
end
resolve_overloads(changes, genv, node, param_map, a_args, ret) { |method_type| ... } click to toggle source
# File typeprof-0.30.1/lib/typeprof/core/graph/box.rb, line 182
def resolve_overloads(changes, genv, node, param_map, a_args, ret)
  match_any_overload = false
  @method_types.each do |method_type|
    param_map0 = param_map.dup
    if method_type.type_params
      method_type.type_params.zip(yield(method_type)) do |var, vtx|
        param_map0[var] = vtx
      end
    end

    next unless match_arguments?(genv, changes, param_map0, a_args, method_type)

    rbs_blk = method_type.block
    next if method_type.block_required && !a_args.block
    next if !rbs_blk && a_args.block
    if rbs_blk && a_args.block
      # rbs_blk_func.optional_keywords, ...
      a_args.block.each_type do |ty|
        case ty
        when Type::Proc
          blk_f_ret = rbs_blk.return_type.contravariant_vertex(genv, changes, param_map0)
          blk_a_args = rbs_blk.req_positionals.map do |blk_a_arg|
            blk_a_arg.covariant_vertex(genv, changes, param_map0)
          end

          ty.block.accept_args(genv, changes, blk_a_args, blk_f_ret, true)
        end
      end
    end
    ret_vtx = method_type.return_type.covariant_vertex(genv, changes, param_map0)

    changes.add_edge(genv, ret_vtx, ret)
    match_any_overload = true
  end
  unless match_any_overload
    meth = node.mid_code_range ? :mid_code_range : :code_range
    changes.add_diagnostic(meth, "failed to resolve overloads")
  end
end
show() click to toggle source
# File typeprof-0.30.1/lib/typeprof/core/graph/box.rb, line 222
def show
  @method_types.map do |method_type|
    args = []
    method_type.req_positionals.each do |arg|
      args << arg.show
    end
    method_type.opt_positionals.each do |arg|
      args << "?#{arg.show}"
    end
    if method_type.rest_positionals
      args << "*#{method_type.rest_positionals.show}"
    end
    method_type.post_positionals.each do |arg|
      args << arg.show
    end

    method_type.req_keywords.each do |key, arg|
      args << "#{ key }: #{arg.show}"
    end
    method_type.opt_keywords.each do |key, arg|
      args << "?#{ key }: #{arg.show}"
    end
    if method_type.rest_keywords
      args << "**#{method_type.rest_keywords.show}"
    end

    s = args.empty? ? "-> " : "(#{ args.join(", ") }) -> "
    s += method_type.return_type.show
  end.join(" | ")
end