Class: JsDuck::Evaluator

Inherits:
Object
  • Object
show all
Defined in:
lib/jsduck/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)


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

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



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

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.



17
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
# File 'lib/jsduck/evaluator.rb', line 17

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