class ASTree

Constants

I_LINE
L_LINE
SPACE_SIZE
T_LINE
VERSION

Public Class Methods

new(source_code) click to toggle source
# File lib/astree.rb, line 17
def initialize(source_code)
  ast = RubyVM::AbstractSyntaxTree.parse(source_code)
  @buffer = traverse(ast)
end
parse(source_code) click to toggle source
# File lib/astree.rb, line 13
def self.parse(source_code)
  new(source_code)
end

Public Instance Methods

to_s() click to toggle source
# File lib/astree.rb, line 22
def to_s
  @buffer
end

Private Instance Methods

draw_line(token:, last_element:) click to toggle source
# File lib/astree.rb, line 67
def draw_line(token:, last_element:)
  '%s %s' % [last_element ? L_LINE : T_LINE, token]
end
draw_space(last_element:) click to toggle source
# File lib/astree.rb, line 63
def draw_space(last_element:)
  last_element ? ' ' * SPACE_SIZE : I_LINE + ' ' * (SPACE_SIZE - 1)
end
pretty_element(node:, index:) click to toggle source
# File lib/astree.rb, line 54
def pretty_element(node:, index:)
  klass = PrettyNode.const_get(node.type)
  klass.new(node).stringify_element(index)
end
stringify_node(node) click to toggle source
# File lib/astree.rb, line 59
def stringify_node(node)
  "<%s> [%d:%d-%d:%d]\n" % [node.type.to_s.colorize(:blue), node.first_lineno, node.first_column, node.last_lineno, node.last_column]
end
traverse(node) click to toggle source
# File lib/astree.rb, line 28
def traverse(node)
  buffer = stringify_node(node)

  children = node.children
  children_count = children.size

  children_count.times do |index|
    child = children[index]
    last_element = children_count == index + 1

    child_buffer = if child.instance_of?(RubyVM::AbstractSyntaxTree::Node)
                     traverse(child)
                   else
                     pretty_element(node: node, index: index)
                   end.lines

    buffer << draw_line(token: child_buffer.shift, last_element: last_element)

    child_buffer.each do |line|
      buffer << draw_space(last_element: last_element) + line
    end
  end

  buffer
end