class JsDuck::Js::Property

Auto-detection of properties.

Public Instance Methods

detect(ast) click to toggle source

Checks if AST node is a property, and if so, returns doc-hash with property name and various auto-detected attributes. When not a property returns nil.

# File lib/jsduck/js/property.rb, line 13
def detect(ast)
  exp = ast.expression_statement? ? ast["expression"] : nil
  var = ast.variable_declaration? ? ast["declarations"][0] : nil

  # foo = ...
  if exp && exp.assignment_expression?
    make(exp["left"].to_s, exp["right"])

    # var foo = ...
  elsif var
    make(var["id"].to_s, var["init"])

    # foo: ...
  elsif ast.property?
    make(ast["key"].key_value, ast["value"])

    # foo;
  elsif exp && exp.identifier?
    make(exp.to_s)

    # "foo"  (inside some expression)
  elsif ast.string?
    make(ast.to_value)

    # "foo";  (as a statement of it's own)
  elsif exp && exp.string?
    make(exp.to_value)

    # Object.defineProperty(obj, "prop", {value: x})
  elsif exp && exp.define_property?
    name = exp["arguments"][1].to_value

    if exp.object_descriptor("set")
      # Object with a setter is not readonly
      make(name)
    elsif exp.object_descriptor("get")
      # Object with a getter and no setter is readonly
      make(name, nil, true)
    else
      writable = exp.object_descriptor("writable")
      readonly = writable ? !writable.to_value : true
      make(name, exp.object_descriptor("value"), readonly)
    end

  else
    nil
  end
end
make(name=nil, ast=nil, readonly=nil) click to toggle source

Produces a doc-hash for a property.

# File lib/jsduck/js/property.rb, line 63
def make(name=nil, ast=nil, readonly=nil)
  return {
    :tagname => :property,
    :name => name,
    :type => ast && ast.value_type,
    :default => ast && default(ast),
    :readonly => readonly,
  }
end

Private Instance Methods

default(ast) click to toggle source
# File lib/jsduck/js/property.rb, line 75
def default(ast)
  ast.to_value != nil ? ast.to_s : nil
end