class SyntaxTree::MermaidVisitor

This visitor transforms the AST into a mermaid flow chart.

def comments(node)

def comments(node)
  # Ignore
end

def field(name, value)

def field(name, value)
  case value
  when nil
    # skip
  when Node
    flowchart.link(target, visit(value), name)
  else
    to =
      flowchart.node("#{target.id}_#{name}", value.inspect, shape: :stadium)
    flowchart.link(target, to, name)
  end
end

def initialize

def initialize
  @flowchart = Mermaid.flowchart
  @target = nil
end

def list(name, values)

def list(name, values)
  values.each_with_index do |value, index|
    field("#{name}[#{index}]", value)
  end
end

def node(node, type)

def node(node, type)
  previous_target = target
  begin
    @target = flowchart.node("node_#{node.object_id}", type)
    yield
    @target
  ensure
    @target = previous_target
  end
end

def pairs(name, values)

def pairs(name, values)
  values.each_with_index do |(key, value), index|
    to = flowchart.node("#{target.id}_#{name}_#{index}", shape: :circle)
    flowchart.link(target, to, "#{name}[#{index}]")
    flowchart.link(to, visit(key), "[0]")
    flowchart.link(to, visit(value), "[1]") if value
  end
end

def text(name, value)

def text(name, value)
  field(name, value)
end

def visit_program(node)

def visit_program(node)
  super
  flowchart.render
end