Sha256: d2eb04d1879c896445bfc1b2164fb5ec21776aef38c30fc2b7aef9dca0d962ef

Contents?: true

Size: 1.39 KB

Versions: 1

Compression:

Stored size: 1.39 KB

Contents

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

      def initialize(type, children=[], metadata={})
        @type, @children, @metadata = type.to_sym, children, metadata
      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 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 child.is_a? Node
            str << "\n#{child.to_sexp(indent + 1)}"
          else
            str << " #{child.inspect}"
          end
        end

        str << ")"

        str
      end
      alias :inspect :to_sexp

      protected

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

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
furnace-0.0.1 lib/furnace/ast/node.rb