class Riml::ClassDependencyGraph
Used for reordering ‘riml_include`s based on class dependencies.
Attributes
definition_graph[R]
encountered_graph[R]
Public Class Methods
new()
click to toggle source
definition_graph
: { “faster_car.riml” => { “s:FasterCar” => “s:Car” }, “car.riml” => { “s:Car” => nil } } encountered_graph
: { “faster_car.riml” => [“s:FasterCar”, “s:Car”], “car.riml” => [“s:Car”] }
# File lib/riml/class_dependency_graph.rb, line 13 def initialize @definition_graph = {} @encountered_graph = {} @filename_graph = nil end
Public Instance Methods
class_defined(filename, class_name, superclass_name)
click to toggle source
# File lib/riml/class_dependency_graph.rb, line 19 def class_defined(filename, class_name, superclass_name) @definition_graph[filename] ||= {} @definition_graph[filename][class_name] = superclass_name class_encountered(filename, class_name) class_encountered(filename, superclass_name) if superclass_name end
class_encountered(filename, class_name)
click to toggle source
# File lib/riml/class_dependency_graph.rb, line 26 def class_encountered(filename, class_name) @encountered_graph[filename] ||= [] unless @encountered_graph[filename].include?(class_name) @encountered_graph[filename] << class_name end end
prepare_filename_graph!()
click to toggle source
Computes ‘@filename_graph` from `@encountered_graph` and `@definition_graph`. This graph is used by `tsort` to sort the filenames for inclusion.
# File lib/riml/class_dependency_graph.rb, line 45 def prepare_filename_graph! @filename_graph = {} @encountered_graph.each do |filename, encountered_classes| dependent_class_names = if @definition_graph[filename].nil? encountered_classes else class_names_defined_in_file = @definition_graph[filename].keys # all superclass names that this file depends on class_names_dependent_by_superclass = @definition_graph[filename].values.compact - class_names_defined_in_file class_names_dependent_by_use = encountered_classes - class_names_defined_in_file class_names_dependent_by_superclass + class_names_dependent_by_use end dependent_class_names.each do |dep| dependent_definition_fname = @definition_graph.detect { |fname, hash| hash.has_key?(dep) }.first rescue nil if dependent_definition_fname @filename_graph[filename] ||= [] unless @filename_graph[filename].include?(dependent_definition_fname) @filename_graph[filename] << dependent_definition_fname end end end end end
tsort()
click to toggle source
order in which filenames need to be included based off internal ‘@definition_graph` and `@encountered_graph` @return Array filenames
Calls superclass method
# File lib/riml/class_dependency_graph.rb, line 36 def tsort prepare_filename_graph! if @filename_graph.nil? super end
Also aliased as: filename_order
tsort_each_child(node, &block)
click to toggle source
# File lib/riml/class_dependency_graph.rb, line 74 def tsort_each_child(node, &block) if @filename_graph[node] @filename_graph[node].each(&block) else [] end end
tsort_each_node(&block)
click to toggle source
# File lib/riml/class_dependency_graph.rb, line 70 def tsort_each_node(&block) @filename_graph.each_key(&block) end