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
filename_order()
Alias for: tsort
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