class VisualizeRuby::Parser::Begin

Public Instance Methods

parse() click to toggle source

@return [Array<VisualizeRuby::Node>, Array<VisualizeRuby::Edge>]

# File lib/visualize_ruby/parser/begin.rb, line 5
def parse
  last_node = nil
  @ast.children.to_a.compact.reverse.each do |a| # builds tree from bottom up
    _nodes, _edges = Parser.new(ast: a).parse
    edges.concat(_edges.reverse)
    nodes.concat(_nodes.reverse)
    connect_nodes(_edges, _nodes, last_node) if last_node
    last_node = _nodes.first
  end
  return nodes.reverse, edges.reverse
end

Private Instance Methods

connect_nodes(_edges, _nodes, last_node) click to toggle source
# File lib/visualize_ruby/parser/begin.rb, line 19
def connect_nodes(_edges, _nodes, last_node)
  no_top_edge_nodes(_edges, _nodes).each do |n|
    if n.type == :branch_leaf # remove inserted branch leaf, added from Parser::If, and connect to last_node
      # (node-bool->branch_leaf) REPLACE WITH (node-bool->last_node)
      edge          = _edges.detect { |e| e.node_b == n }
      edge.nodes[1] = last_node
      nodes.delete(n)
    elsif n.type != :return # 1. (-> n) 2. (-> n -> last_node)
      edges << Edge.new(nodes: [n, last_node])
    end
  end
end
no_top_edge_nodes(_edges, _nodes) click to toggle source
# File lib/visualize_ruby/parser/begin.rb, line 32
def no_top_edge_nodes(_edges, _nodes)
  _nodes.select do |n| # ONLY (-> n) NOT (n ->)
    _edges.none? { |e| e.node_a == n }
  end
end