class Orbacle::GlobalTree
Attributes
id_generator[R]
Public Class Methods
new(id_generator)
click to toggle source
# File lib/orbacle/global_tree.rb, line 91 def initialize(id_generator) @id_generator = id_generator @constants = ConstantsTree.new @classes_by_id = {} @modules_by_id = {} @methods_by_class_id = Hash.new {|h,k| h[k] = Hash.new {|h2, k2| h2[k2] = [] } } @methods_by_id = {} @lambdas_by_id = {} @type_mapping = Hash.new(BottomType.new) end
Public Instance Methods
add_class(parent_ref)
click to toggle source
Definitions
# File lib/orbacle/global_tree.rb, line 179 def add_class(parent_ref) klass = Klass.new(id_generator.call, parent_ref) @classes_by_id[klass.id] = klass klass end
add_constant(constant)
click to toggle source
Constants
# File lib/orbacle/global_tree.rb, line 216 def add_constant(constant) @constants.add_element(constant.scope, constant.name, constant) constant end
add_lambda(args)
click to toggle source
Lambdas
# File lib/orbacle/global_tree.rb, line 231 def add_lambda(args) lamba = Lambda.new(id_generator.call, args) @lambdas_by_id[lamba.id] = lamba lamba end
add_method(id, place_of_definition_id, name, location, visibility, args)
click to toggle source
Methods
# File lib/orbacle/global_tree.rb, line 104 def add_method(id, place_of_definition_id, name, location, visibility, args) metod = Method.new(id, place_of_definition_id, name, location, visibility, args) @methods_by_class_id[metod.place_of_definition_id][metod.name] << metod @methods_by_id[metod.id] = metod metod end
add_module()
click to toggle source
# File lib/orbacle/global_tree.rb, line 185 def add_module mod = Mod.new(id_generator.call) @modules_by_id[mod.id] = mod mod end
change_method_visibility(klass_id, name, new_visibility)
click to toggle source
# File lib/orbacle/global_tree.rb, line 161 def change_method_visibility(klass_id, name, new_visibility) @methods_by_class_id[klass_id][name].each do |m| m.visibility = new_visibility end end
find_class_by_name(full_name)
click to toggle source
# File lib/orbacle/global_tree.rb, line 261 def find_class_by_name(full_name) const = find_constant_by_name(full_name) return nil if const.nil? get_class(const.definition_id) end
find_class_method_from_class_name(class_name, method_name)
click to toggle source
# File lib/orbacle/global_tree.rb, line 142 def find_class_method_from_class_name(class_name, method_name) get_class_methods_from_class_name(class_name, method_name).first end
find_constant_by_name(full_name)
click to toggle source
# File lib/orbacle/global_tree.rb, line 273 def find_constant_by_name(full_name) @constants.find_by_const_name(ConstName.from_string(full_name)) end
find_constant_for_definition(definition_id)
click to toggle source
# File lib/orbacle/global_tree.rb, line 277 def find_constant_for_definition(definition_id) @constants.find do |constant| constant.definition_id.equal?(definition_id) end end
find_deep_class_method_from_class_name(class_name, method_name)
click to toggle source
# File lib/orbacle/global_tree.rb, line 301 def find_deep_class_method_from_class_name(class_name, method_name) get_deep_class_methods_from_class_name(class_name, method_name).first end
find_deep_instance_method_from_class_name(class_name, method_name)
click to toggle source
# File lib/orbacle/global_tree.rb, line 283 def find_deep_instance_method_from_class_name(class_name, method_name) get_deep_instance_methods_from_class_name(class_name, method_name).first end
find_instance_method_from_class_id(class_id, method_name)
click to toggle source
# File lib/orbacle/global_tree.rb, line 115 def find_instance_method_from_class_id(class_id, method_name) get_instance_methods_from_class_id(class_id, method_name).first end
find_instance_method_from_class_name(class_name, method_name)
click to toggle source
# File lib/orbacle/global_tree.rb, line 111 def find_instance_method_from_class_name(class_name, method_name) get_instance_methods_from_class_name(class_name, method_name).first end
find_method_including_position(file_path, position)
click to toggle source
# File lib/orbacle/global_tree.rb, line 167 def find_method_including_position(file_path, position) @methods_by_id .values .select {|m| m.location && m.location.uri.eql?(file_path) && m.location.position_range.include_position?(position) } .sort_by {|m| m.location.span } .first end
find_module_by_name(full_name)
click to toggle source
# File lib/orbacle/global_tree.rb, line 267 def find_module_by_name(full_name) const = find_constant_by_name(full_name) return nil if const.nil? get_module(const.definition_id) end
find_super_method(method_id)
click to toggle source
# File lib/orbacle/global_tree.rb, line 152 def find_super_method(method_id) analyzed_method = @methods_by_id.fetch(method_id) klass_of_this_method = get_class(analyzed_method.place_of_definition_id) return nil if klass_of_this_method.nil? || klass_of_this_method.parent_ref.nil? parent_klass = solve_reference(klass_of_this_method.parent_ref) return nil if parent_klass.nil? find_instance_method_from_class_name(parent_klass.full_name, analyzed_method.name) end
get_all_instance_methods_from_class_name(class_name)
click to toggle source
# File lib/orbacle/global_tree.rb, line 136 def get_all_instance_methods_from_class_name(class_name) klass = find_class_by_name(class_name) return [] if klass.nil? @methods_by_class_id[klass.id].values.flatten end
get_class(class_id)
click to toggle source
# File lib/orbacle/global_tree.rb, line 191 def get_class(class_id) @classes_by_id[class_id] end
get_class_methods_from_class_name(class_name, method_name)
click to toggle source
# File lib/orbacle/global_tree.rb, line 129 def get_class_methods_from_class_name(class_name, method_name) klass = find_class_by_name(class_name) return [] if klass.nil? eigenclass = get_eigenclass_of_definition(klass.id) get_instance_methods_from_class_id(eigenclass.id, method_name) end
get_deep_class_methods_from_class_name(class_name, method_name)
click to toggle source
# File lib/orbacle/global_tree.rb, line 305 def get_deep_class_methods_from_class_name(class_name, method_name) found_methods = get_class_methods_from_class_name(class_name, method_name) if found_methods.empty? parent_name = get_parent_of(class_name) if parent_name get_deep_class_methods_from_class_name(parent_name, method_name) else [] end else found_methods end end
get_deep_instance_methods_from_class_name(class_name, method_name)
click to toggle source
# File lib/orbacle/global_tree.rb, line 287 def get_deep_instance_methods_from_class_name(class_name, method_name) found_methods = get_instance_methods_from_class_name(class_name, method_name) if found_methods.empty? parent_name = get_parent_of(class_name) if parent_name get_deep_instance_methods_from_class_name(parent_name, method_name) else [] end else found_methods end end
get_definition(definition_id)
click to toggle source
# File lib/orbacle/global_tree.rb, line 199 def get_definition(definition_id) get_class(definition_id) || get_module(definition_id) end
get_eigenclass_of_definition(definition_id)
click to toggle source
# File lib/orbacle/global_tree.rb, line 203 def get_eigenclass_of_definition(definition_id) definition = get_definition(definition_id) if definition.eigenclass_id get_class(definition.eigenclass_id) else eigenclass = add_class(nil) definition.eigenclass_id = eigenclass.id eigenclass end end
get_instance_methods_from_class_id(class_id, method_name)
click to toggle source
# File lib/orbacle/global_tree.rb, line 119 def get_instance_methods_from_class_id(class_id, method_name) @methods_by_class_id[class_id][method_name] end
get_instance_methods_from_class_name(class_name, method_name)
click to toggle source
# File lib/orbacle/global_tree.rb, line 123 def get_instance_methods_from_class_name(class_name, method_name) klass = find_class_by_name(class_name) return [] if klass.nil? get_instance_methods_from_class_id(klass.id, method_name) end
get_lambda(lambda_id)
click to toggle source
# File lib/orbacle/global_tree.rb, line 237 def get_lambda(lambda_id) @lambdas_by_id[lambda_id] end
get_methods(method_name)
click to toggle source
# File lib/orbacle/global_tree.rb, line 146 def get_methods(method_name) @methods_by_id.values.select do |m| m.name.eql?(method_name) end end
get_module(module_id)
click to toggle source
# File lib/orbacle/global_tree.rb, line 195 def get_module(module_id) @modules_by_id[module_id] end
get_parent_of(class_name)
click to toggle source
Other
# File lib/orbacle/global_tree.rb, line 243 def get_parent_of(class_name) return nil if class_name.eql?("Object") const = find_constant_by_name(class_name) return "Object" if const.nil? klass = get_class(const.definition_id) return "Object" if klass.nil? return "Object" if klass.parent_ref.nil? parent_const = solve_reference(klass.parent_ref) if parent_const parent_const.full_name else klass.parent_ref.relative_name end end
set_type_of(node, new_type)
click to toggle source
# File lib/orbacle/global_tree.rb, line 325 def set_type_of(node, new_type) @type_mapping[node] = new_type end
solve_reference(const_ref)
click to toggle source
# File lib/orbacle/global_tree.rb, line 221 def solve_reference(const_ref) @constants.find_by_const_ref(const_ref) end
solve_reference2(const_ref)
click to toggle source
# File lib/orbacle/global_tree.rb, line 225 def solve_reference2(const_ref) @constants.select_by_const_ref(const_ref) end
type_of(node)
click to toggle source
Types
# File lib/orbacle/global_tree.rb, line 321 def type_of(node) @type_mapping[node] end