class Lucid::AST::Walker

Attributes

context[RW]
runtime[R]

Public Class Methods

new(runtime, listeners = [], context = Lucid::Context.default) click to toggle source
# File lib/lucid/ast/walker.rb, line 7
def initialize(runtime, listeners = [], context = Lucid::Context.default)
  @runtime, @listeners, @context = runtime, listeners, context
end

Public Instance Methods

method_missing(message, *args, &block) click to toggle source

This is being used to forward on messages from the AST to the formatters.

# File lib/lucid/ast/walker.rb, line 13
def method_missing(message, *args, &block)
  send_message(message, *args, &block)
end
visit_multiline_arg(multiline_arg) click to toggle source
# File lib/lucid/ast/walker.rb, line 17
def visit_multiline_arg(multiline_arg)
  broadcast(multiline_arg) do
    multiline_arg.accept(self)
  end
end

Private Instance Methods

broadcast(*args, &block) click to toggle source
# File lib/lucid/ast/walker.rb, line 25
def broadcast(*args, &block)
  message = extract_method_name_from(caller[0])
  send_message message, *args, &block
  self
end
extract_method_name_from(call_stack) click to toggle source
# File lib/lucid/ast/walker.rb, line 52
def extract_method_name_from(call_stack)
  match = call_stack.match(/in `(.*)'/)
  match.captures[0]
end
send_message(message, *args) { || ... } click to toggle source
# File lib/lucid/ast/walker.rb, line 31
def send_message(message, *args, &block)
  return self if Lucid.wants_to_quit
  message = message.to_s.gsub('visit_', '')
  if block_given?
    send_to_listeners("before_#{message}", *args)
    yield if block_given?
    send_to_listeners("after_#{message}", *args)
  else
    send_to_listeners(message, *args)
  end
  self
end
send_to_listeners(message, *args) click to toggle source
# File lib/lucid/ast/walker.rb, line 44
def send_to_listeners(message, *args)
  @listeners.each do |listener|
    if listener.respond_to?(message)
      listener.__send__(message, *args)
    end
  end
end