class MotionBlender::Analyzer::Parser

Attributes

cache[R]
evaluators[R]
file[R]
referring_constants[R]

Public Class Methods

new(file) click to toggle source
# File lib/motion_blender/analyzer/parser.rb, line 15
def initialize file
  @file = file.to_s
  @evaluators = []
end

Public Instance Methods

autoloads_with(autoloads) click to toggle source
# File lib/motion_blender/analyzer/parser.rb, line 69
def autoloads_with autoloads
  referring_constants.map do |mods, const|
    key =
      mods
      .length.downto(0)
      .map { |i| [*mods.take(i), const].join('::') }
      .find { |k| autoloads.key?(k) }
    autoloads[key]
  end.flatten.compact
end
dependent_requires(opts = {}) click to toggle source
# File lib/motion_blender/analyzer/parser.rb, line 80
def dependent_requires opts = {}
  autoloads = opts[:autoloads]
  reqs = requires.reject(&:autoload?)
  reqs += autoloads_with(autoloads) if autoloads
  reqs.uniq(&:file)
end
evaluate(source) click to toggle source
# File lib/motion_blender/analyzer/parser.rb, line 52
def evaluate source
  @evaluators << Evaluator.new(source)
  @evaluators.last.run
end
last_trace() click to toggle source
# File lib/motion_blender/analyzer/parser.rb, line 65
def last_trace
  @evaluators.last.try :trace
end
parse() click to toggle source
# File lib/motion_blender/analyzer/parser.rb, line 20
def parse
  cached = cache.fetch do
    run_callbacks :parse do
      root = Source.parse_file(@file)
      traverse(root)
      {
        sources: processed_sources.map(&:attributes),
        referring_constants: root.referring_constants
      }
    end
  end
  if cached && cache.hit?
    cached[:sources].each do |attrs|
      evaluate Source.new(attrs)
    end
  end
  @referring_constants = cached[:referring_constants]
  self
end
processed_sources() click to toggle source
# File lib/motion_blender/analyzer/parser.rb, line 61
def processed_sources
  @evaluators.select(&:done?).map(&:source)
end
requires() click to toggle source
# File lib/motion_blender/analyzer/parser.rb, line 57
def requires
  @evaluators.map(&:requires).flatten
end
traverse(source) click to toggle source
# File lib/motion_blender/analyzer/parser.rb, line 44
def traverse source
  if Collector.requirable?(source)
    evaluate source
  elsif Collector.acceptable?(source)
    source.children.compact.each { |src| traverse src }
  end
end