Class: MotionBlender::Analyzer::Evaluator

Inherits:
Object
  • Object
show all
Defined in:
lib/motion_blender/analyzer/evaluator.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(file, ast, stack = [], method = nil) ⇒ Evaluator

Returns a new instance of Evaluator.



9
10
11
12
13
14
# File 'lib/motion_blender/analyzer/evaluator.rb', line 9

def initialize file, ast, stack = [], method = nil
  @file = file
  @ast = ast
  @stack = stack
  @method = method || @ast.children[1]
end

Instance Attribute Details

#astObject (readonly)

Returns the value of attribute ast.



7
8
9
# File 'lib/motion_blender/analyzer/evaluator.rb', line 7

def ast
  @ast
end

#fileObject (readonly)

Returns the value of attribute file.



7
8
9
# File 'lib/motion_blender/analyzer/evaluator.rb', line 7

def file
  @file
end

#stackObject (readonly)

Returns the value of attribute stack.



7
8
9
# File 'lib/motion_blender/analyzer/evaluator.rb', line 7

def stack
  @stack
end

Class Method Details

.extractor_for(method) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/motion_blender/analyzer/evaluator.rb', line 51

def self.extractor_for method
  @extractor_classes ||= {}
  @extractor_classes[method] ||= Class.new do
    define_method method do |arg|
      req = Require.new(@_file, method, arg)
      unless req.excluded?
        @_args ||= []
        @_args << req
      end
    end

    define_method :__ORIGINAL__ do
      OriginalFinder.new(@_file).find
    end
  end
end

Instance Method Details

#create_extractorObject



44
45
46
47
48
49
# File 'lib/motion_blender/analyzer/evaluator.rb', line 44

def create_extractor
  file = @file
  extractor = Evaluator.extractor_for(@method).new
  extractor.instance_eval { @_file = file }
  extractor
end

#parse_argsObject



16
17
18
19
20
21
22
23
24
# File 'lib/motion_blender/analyzer/evaluator.rb', line 16

def parse_args
  extractor = create_extractor
  extractor.instance_eval(@ast.loc.expression.source, @file)
  extractor.instance_eval { @_args || [] }
rescue ScriptError => err
  recover_from_script_error err
rescue StandardError => err
  recover_from_standard_error err
end

#recover_from_script_error(err) ⇒ Object



26
27
28
29
30
31
32
33
34
# File 'lib/motion_blender/analyzer/evaluator.rb', line 26

def recover_from_script_error err
  i = @stack.find_index { |ast| ast.type == :rescue }
  if i && i > 0
    stack = @stack[0..(i - 1)]
    Evaluator.new(@file, stack.last, stack[0..-2], @method).parse_args
  else
    fail LoadError, err.message
  end
end

#recover_from_standard_error(err) ⇒ Object



36
37
38
39
40
41
42
# File 'lib/motion_blender/analyzer/evaluator.rb', line 36

def recover_from_standard_error err
  if @stack.any?
    Evaluator.new(@file, @stack.last, @stack[0..-2], @method).parse_args
  else
    fail LoadError, err.message
  end
end