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