class Abstriker::SexpTraverser

Public Class Methods

new(sexp) click to toggle source
# File lib/abstriker.rb, line 17
def initialize(sexp)
  @sexp = sexp
end

Public Instance Methods

traverse(current_sexp = nil, parent = nil) { |sexp, parent| ... } click to toggle source
# File lib/abstriker.rb, line 21
def traverse(current_sexp = nil, parent = nil, &block)
  sexp = current_sexp || @sexp
  first = sexp[0]
  if first.is_a?(Symbol) # node
    yield sexp, parent
    args = Ripper::PARSER_EVENT_TABLE[first]
    return if args.nil? || args.zero?

    args.times do |i|
      param = sexp[i + 1]
      if param.is_a?(Array)
        traverse(param, sexp, &block)
      end
    end
  else # array
    sexp.each do |n|
      if n.is_a?(Array)
        traverse(n, sexp, &block)
      end
    end
  end
end