class TypeProf::Scratch::ClassDef

Attributes

absolute_path[R]
cvars[R]
ivars[R]
kind[R]
klass_obj[RW]
methods[R]
modules[R]
name[RW]
subclasses[R]
superclass[R]

Public Class Methods

new(kind, name, absolute_path, superclass) click to toggle source
# File typeprof-0.21.11/lib/typeprof/analyzer.rb, line 348
def initialize(kind, name, absolute_path, superclass)
  raise unless name.is_a?(Array)
  @kind = kind
  @modules = {
    :before => { true => [], false => [] }, # before = include/extend
    :after  => { true => [], false => [] }, # after = prepend
  }
  @name = name
  @consts = {}
  @methods = {}
  @ivars = VarTable.new
  @cvars = VarTable.new
  @absolute_path = absolute_path
  @namespace = nil
  @superclass = superclass
  @subclasses = []
end

Public Instance Methods

add_class_open(name, open_ep) click to toggle source
# File typeprof-0.21.11/lib/typeprof/analyzer.rb, line 404
def add_class_open(name, open_ep)
  ty, eps = @consts[name]
  raise "call this only if the class is opened more than once" if ty.nil?
  @consts[name] = [ty, eps + [open_ep&.detailed_source_location]]
end
add_constant(name, ty, def_ep) click to toggle source
# File typeprof-0.21.11/lib/typeprof/analyzer.rb, line 386
def add_constant(name, ty, def_ep)
  if @consts[name]
    # XXX: warn!
    _, eps = @consts[name]
    @consts[name] = [ty, eps + [def_ep&.detailed_source_location]]
    return
  end
  @consts[name] = [ty, [def_ep&.detailed_source_location]]
end
add_method(mid, singleton, mdef) click to toggle source
# File typeprof-0.21.11/lib/typeprof/analyzer.rb, line 466
def add_method(mid, singleton, mdef)
  @methods[[singleton, mid]] ||= Utils::MutableSet.new
  @methods[[singleton, mid]] << mdef
  # Need to restart...?
end
adjust_substitution(singleton, mid, mthd, subst, direct) { |subst, direct| ... } click to toggle source
# File typeprof-0.21.11/lib/typeprof/analyzer.rb, line 424
def adjust_substitution(singleton, mid, mthd, subst, direct, &blk)
  adjust_substitution_for_module(@modules[:before][singleton], mid, mthd, subst, &blk)

  mthds = @methods[[singleton, mid]]
  yield subst, direct if mthds&.include?(mthd)

  adjust_substitution_for_module(@modules[:after][singleton], mid, mthd, subst, &blk)
end
adjust_substitution_for_module(mods, mid, mthd, subst, &blk) click to toggle source
# File typeprof-0.21.11/lib/typeprof/analyzer.rb, line 411
def adjust_substitution_for_module(mods, mid, mthd, subst, &blk)
  mods.each do |mod_def, type_args,|
    if mod_def.klass_obj.type_params && type_args
      subst2 = {}
      mod_def.klass_obj.type_params.zip(type_args) do |(tyvar, *), tyarg|
        tyvar = Type::Var.new(tyvar)
        subst2[tyvar] = tyarg.substitute(subst, Config.current.options[:type_depth_limit])
      end
      mod_def.adjust_substitution(false, mid, mthd, subst2, false, &blk)
    end
  end
end
check_typed(mid, singleton, klass) click to toggle source
# File typeprof-0.21.11/lib/typeprof/analyzer.rb, line 450
def check_typed(mid, singleton, klass)
  set = @methods[[singleton, mid]]
  return nil unless set
  set = set.select {|mdef| mdef.is_a?(klass) }
  return nil if set.empty?
  return set
end
check_typed_attr(mid, singleton) click to toggle source
# File typeprof-0.21.11/lib/typeprof/analyzer.rb, line 462
def check_typed_attr(mid, singleton)
  check_typed(mid, singleton, TypedAttrMethodDef)
end
check_typed_method(mid, singleton) click to toggle source
# File typeprof-0.21.11/lib/typeprof/analyzer.rb, line 458
def check_typed_method(mid, singleton)
  check_typed(mid, singleton, TypedMethodDef)
end
consts() click to toggle source
# File typeprof-0.21.11/lib/typeprof/analyzer.rb, line 396
def consts
  @consts.lazy.flat_map do |name, (ty, eps)|
    eps.map do |ep|
      [name, [ty, ep]]
    end
  end
end
get_constant(name) click to toggle source
# File typeprof-0.21.11/lib/typeprof/analyzer.rb, line 380
def get_constant(name)
  ty, locs = @consts[name]
  ty = ty || Type.any # XXX: warn?
  return ty, locs
end
mix_module(kind, mod, type_args, singleton, absolute_path) click to toggle source
# File typeprof-0.21.11/lib/typeprof/analyzer.rb, line 369
def mix_module(kind, mod, type_args, singleton, absolute_path)
  mod_, module_type_args, absolute_paths = @modules[kind][singleton].find {|m,| m == mod }
  if mod_
    raise "inconsistent #{ kind == :after ? "include/extend" : "prepend" } type args in RBS?" if module_type_args != type_args && type_args != [] && type_args != nil
  else
    absolute_paths = Utils::MutableSet.new
    @modules[kind][singleton].unshift([mod, type_args, absolute_paths])
  end
  absolute_paths << absolute_path
end
search_method(singleton, mid, visited) { |mthds, klass_obj, singleton| ... } click to toggle source
# File typeprof-0.21.11/lib/typeprof/analyzer.rb, line 433
def search_method(singleton, mid, visited, &blk)
  # Currently, circular inclusion of modules is allowed
  return if visited[self]
  visited[self] = true

  @modules[:before][singleton].each do |mod_def,|
    mod_def.search_method(false, mid, visited, &blk)
  end

  mthds = @methods[[singleton, mid]]
  yield mthds, @klass_obj, singleton if mthds

  @modules[:after][singleton].each do |mod_def,|
    mod_def.search_method(false, mid, visited, &blk)
  end
end
set_method(mid, singleton, mdef) click to toggle source
# File typeprof-0.21.11/lib/typeprof/analyzer.rb, line 472
def set_method(mid, singleton, mdef)
  if mdef
    @methods[[singleton, mid]] = Utils::MutableSet.new
    @methods[[singleton, mid]] << mdef
  else
    @methods.delete([singleton, mid])
  end
end