Sha256: ec0961f48ccc91e477d49a8e3711574c2cfc68f445bf5aa36d7ef1632bfabb5b

Contents?: true

Size: 1.93 KB

Versions: 2

Compression:

Stored size: 1.93 KB

Contents

module Furnace::AST
  class Node
    attr_accessor :type, :parent, :children, :metadata

    def initialize(type, children=[], metadata={})
      @type, @children, @metadata = type.to_sym, children, metadata
    end

    def normalize_hierarchy!
      @children.each do |child|
        if child.respond_to? :parent=
          child.parent = self
        end

        if child.respond_to? :normalize_hierarchy!
          child.normalize_hierarchy!
        end
      end

      self
    end

    def update(type, children=nil, metadata={})
      @type     = type
      @children = children || @children

      # If something non-nil is passed, including default value, then merge.
      # Else, clear metadata store.
      if metadata
        @metadata.merge!(metadata)
      else
        @metadata = {}
      end

      self
    end

    def dup
      node = super
      node.children = @children.dup
      node.metadata = @metadata.dup
      node
    end

    def index
      parent.children.find_index(self)
    end

    def next
      parent.children[index + 1]
    end

    def prev
      parent.children[index - 1]
    end

    def to_s
      "(#{fancy_type} ...)"
    end

    def to_sexp(indent=0)
      str = "#{"  " * indent}(#{fancy_type}"

      children.each do |child|
        if (!children[0].is_a?(Node) && child.is_a?(Node)) ||
            (children[0].is_a?(Node) && child.is_a?(Node) &&
              child.children.any? { |c| c.is_a?(Node) || c.is_a?(Array) }) ||
            (child.is_a?(Node) && child.metadata[:label])
          str << "\n#{child.to_sexp(indent + 1)}"
        else
          str << " #{child.inspect}"
        end
      end

      str << ")"

      str
    end
    alias :inspect :to_sexp

    def to_astlet
      self
    end

    protected

    def fancy_type
      dasherized = @type.to_s.gsub('_', '-')
      if @metadata[:label]
        "#{@metadata[:label]}:#{dasherized}"
      else
        dasherized
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
furnace-0.0.3 lib/furnace/ast/node.rb
furnace-0.0.2 lib/furnace/ast/node.rb