Class: TypeProf::Scratch::ClassDef
Relationships & Source Files | |
Inherits: | Object |
Defined in: | lib/typeprof/analyzer.rb |
Overview
or ModuleDef
Class Method Summary
- .new(kind, name, absolute_path) ⇒ ClassDef constructor
Instance Attribute Summary
- #absolute_path readonly
- #consts readonly
- #cvars readonly
- #ivars readonly
- #kind readonly
- #klass_obj rw
- #methods readonly
- #modules readonly
- #name rw
- #subclasses readonly
Instance Method Summary
- #add_constant(name, ty, absolute_path)
- #add_method(mid, singleton, mdef)
- #adjust_substitution(singleton, mid, mthd, subst, direct) {|subst, direct| ... }
- #adjust_substitution_for_module(mods, mid, mthd, subst, &blk)
- #check_typed_method(mid, singleton)
- #get_constant(name)
- #mix_module(kind, mod, type_args, singleton, absolute_path)
- #search_method(singleton, mid, visited) {|mthds, @klass_obj, singleton| ... }
- #set_method(mid, singleton, mdef)
Constructor Details
.new(kind, name, absolute_path) ⇒ ClassDef
# File 'lib/typeprof/analyzer.rb', line 321
def initialize(kind, name, absolute_path) 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 @subclasses = [] end
Instance Attribute Details
#absolute_path (readonly)
[ GitHub ]#consts (readonly)
[ GitHub ]# File 'lib/typeprof/analyzer.rb', line 338
attr_reader :kind, :modules, :consts, :methods, :ivars, :cvars, :absolute_path, :subclasses
#cvars (readonly)
[ GitHub ]# File 'lib/typeprof/analyzer.rb', line 338
attr_reader :kind, :modules, :consts, :methods, :ivars, :cvars, :absolute_path, :subclasses
#ivars (readonly)
[ GitHub ]# File 'lib/typeprof/analyzer.rb', line 338
attr_reader :kind, :modules, :consts, :methods, :ivars, :cvars, :absolute_path, :subclasses
#kind (readonly)
[ GitHub ]# File 'lib/typeprof/analyzer.rb', line 338
attr_reader :kind, :modules, :consts, :methods, :ivars, :cvars, :absolute_path, :subclasses
#klass_obj (rw)
[ GitHub ]# File 'lib/typeprof/analyzer.rb', line 339
attr_accessor :name, :klass_obj
#methods (readonly)
[ GitHub ]# File 'lib/typeprof/analyzer.rb', line 338
attr_reader :kind, :modules, :consts, :methods, :ivars, :cvars, :absolute_path, :subclasses
#modules (readonly)
[ GitHub ]# File 'lib/typeprof/analyzer.rb', line 338
attr_reader :kind, :modules, :consts, :methods, :ivars, :cvars, :absolute_path, :subclasses
#name (rw)
[ GitHub ]# File 'lib/typeprof/analyzer.rb', line 339
attr_accessor :name, :klass_obj
#subclasses (readonly)
[ GitHub ]Instance Method Details
#add_constant(name, ty, absolute_path)
[ GitHub ]# File 'lib/typeprof/analyzer.rb', line 357
def add_constant(name, ty, absolute_path) if @consts[name] # XXX: warn! end @consts[name] = [ty, absolute_path] end
#add_method(mid, singleton, mdef)
[ GitHub ]# File 'lib/typeprof/analyzer.rb', line 411
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| ... }
# File 'lib/typeprof/analyzer.rb', line 377
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)
[ GitHub ]# File 'lib/typeprof/analyzer.rb', line 364
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. [:type_depth_limit]) end mod_def.adjust_substitution(false, mid, mthd, subst2, false, &blk) end end end
#check_typed_method(mid, singleton)
[ GitHub ]# File 'lib/typeprof/analyzer.rb', line 403
def check_typed_method(mid, singleton) set = @methods[[singleton, mid]] return nil unless set set = set.select {|mdef| mdef.is_a?(TypedMethodDef) } return nil if set.empty? return set end
#get_constant(name)
[ GitHub ]#mix_module(kind, mod, type_args, singleton, absolute_path)
[ GitHub ]# File 'lib/typeprof/analyzer.rb', line 341
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| ... }
# File 'lib/typeprof/analyzer.rb', line 386
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)
[ GitHub ]# File 'lib/typeprof/analyzer.rb', line 417
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