Commit 763e4334 authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Implement AstNodeArray class.

AstNode's must now be created with AstNode.create method, which
will decide whether to create AstNode or AstNodeArray.
parent 164be282
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -49,7 +49,7 @@ module JsDuck
    #     { :tagname => :method, :name => "foo", ... }
    #
    def detect(node)
      ast = AstNode.new(node)
      ast = AstNode.create(node)

      exp = ast.expression_statement? ? ast["expression"] : nil
      var = ast.variable_declaration? ? ast["declarations"][0] : nil
@@ -142,11 +142,11 @@ module JsDuck
    private

    def function?(ast)
      AstNode.new(ast).function?
      AstNode.create(ast).function?
    end

    def empty_fn?(ast)
      AstNode.new(ast).ext_empty_fn?
      AstNode.create(ast).ext_empty_fn?
    end

    def object?(ast)
+12 −3
Original line number Diff line number Diff line
require "jsduck/serializer"
require "jsduck/evaluator"
require "jsduck/ext_patterns"
require "jsduck/ast_node_array"

module JsDuck

  # Wraps around AST node returned from Esprima, providing methods for
  # investigating it.
  class AstNode
    # Factor method that creates either AstNode or AstNodeArray.
    def self.create(node)
      if node.is_a? Array
        AstNodeArray.new(node)
      else
        AstNode.new(node)
      end
    end

    # Initialized with a AST Hash from Esprima.
    def initialize(node)
      @node = node || {}
@@ -14,7 +24,7 @@ module JsDuck

    # Returns a child AST node as AstNode class.
    def child(name)
      AstNode.new(@node[name])
      AstNode.create(@node[name])
    end
    # Shorthand for #child method
    def [](name)
@@ -75,8 +85,7 @@ module JsDuck
    def each_property
      return unless object_expression?

      @node["properties"].each do |p|
        ast = AstNode.new(p)
      child("properties").each do |ast|
        yield(ast["key"].key_value, ast["value"], ast)
      end
    end
+29 −0
Original line number Diff line number Diff line
require "jsduck/ast_node"

module JsDuck

  # Wraps around array of AST nodes.
  class AstNodeArray
    # Initialized with array of AST Hashes from Esprima.
    def initialize(nodes)
      @nodes = nodes || []
    end

    # Returns a child AST node as AstNode class.
    def [](i)
      AstNode.create(@nodes[i])
    end

    # The length of array
    def length
      @nodes.length
    end

    # Iterates over all the AstNodes in array.
    def each
      @nodes.each {|p| yield(AstNode.create(p)) }
    end

  end

end