class Riml::Compiler::Visitor

Base abstract visitor

Attributes

propagate_up_tree[W]

Public Class Methods

new(options={}) click to toggle source
# File lib/riml/compiler.rb, line 28
def initialize(options={})
  @propagate_up_tree = options[:propagate_up_tree]
end

Public Instance Methods

visit(node) click to toggle source
# File lib/riml/compiler.rb, line 32
def visit(node)
  output = compile(node)
  if node.force_newline && output[-1, 1] != "\n"
    output << "\n"
  end
  propagate_up_tree(node, output)
end

Protected Instance Methods

current_compiler(node) click to toggle source
# File lib/riml/compiler.rb, line 63
def current_compiler(node)
  root_node(node).current_compiler
end
propagate_up_tree(node, output) click to toggle source
# File lib/riml/compiler.rb, line 42
def propagate_up_tree(node, output)
  unless @propagate_up_tree == false || node.parent_node.nil?
    node.parent_node.compiled_output << output.to_s
  end
end
root_node(node) click to toggle source
# File lib/riml/compiler.rb, line 56
def root_node(node)
  @root_node ||= begin
    node = node.parent until node.parent.nil?
    node
  end
end
visitor_for_node(node, params={}) click to toggle source
# File lib/riml/compiler.rb, line 48
def visitor_for_node(node, params={})
  class_name = "#{node.class.name.split('::').last}Visitor"
  Compiler.const_get(class_name).new(params)
rescue NameError
  error = CompileError.new("unexpected construct: #{class_name}", node)
  raise error
end