Class: JsDuck::Js::Evaluator

Inherits:
Object
  • Object
show all
Defined in:
lib/jsduck/js/evaluator.rb

Overview

Evaluates Esprima AST node into Ruby object

Instance Method Summary collapse

Instance Method Details

#base_css_prefix?(ast) ⇒ Boolean

True when MemberExpression == Ext.baseCSSPrefix

Returns:

  • (Boolean)


59
60
61
62
63
64
65
# File 'lib/jsduck/js/evaluator.rb', line 59

def base_css_prefix?(ast)
  ast["computed"] == false &&
    ast["object"]["type"] == "Identifier" &&
    ast["object"]["name"] == "Ext" &&
    ast["property"]["type"] == "Identifier" &&
    ast["property"]["name"] == "baseCSSPrefix"
end

#key_value(key) ⇒ Object

Turns object property key into string value



54
55
56
# File 'lib/jsduck/js/evaluator.rb', line 54

def key_value(key)
  key["type"] == "Identifier" ? key["name"] : key["value"]
end

#to_value(ast) ⇒ Object

Converts AST node into a value.

  • String literals become Ruby strings

  • Number literals become Ruby numbers

  • Regex literals become :regexp symbols

  • Array expressions become Ruby arrays

  • etc

For anything it doesn’t know how to evaluate (like a function expression) it throws exception.



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/jsduck/js/evaluator.rb', line 18

def to_value(ast)
  case ast["type"]
  when "ArrayExpression"
    ast["elements"].map {|e| to_value(e) }
  when "ObjectExpression"
    h = {}
    ast["properties"].each do |p|
      key = key_value(p["key"])
      value = to_value(p["value"])
      h[key] = value
    end
    h
  when "BinaryExpression"
    if ast["operator"] == "+"
      to_value(ast["left"]) + to_value(ast["right"])
    else
      throw "Unable to handle operator: " + ast["operator"]
    end
  when "MemberExpression"
    if base_css_prefix?(ast)
      "x-"
    else
      throw "Unable to handle this MemberExpression"
    end
  when "Literal"
    if ast["raw"] =~ /\A\//
      :regexp
    else
      ast["value"]
    end
  else
    throw "Unknown node type: " + ast["type"]
  end
end