class Capataz::Rewriter

Attributes

logs[R]

Public Class Methods

new(options = {}) click to toggle source
# File lib/capataz/rewriter.rb, line 9
def initialize(options = {})
  @options = options || {}
  @logs = options[:logs] || {}
  @self_linker = options[:self_linker]
  @self_send_prefixer = options[:self_send_prefixer]
  @capatized_nodes = Set.new
end

Public Instance Methods

on_array(node) click to toggle source
Calls superclass method
# File lib/capataz/rewriter.rb, line 28
def on_array(node)
  super
  node.children.each { |child| decapatize(child) }
end
on_casgn(node) click to toggle source
Calls superclass method
# File lib/capataz/rewriter.rb, line 61
def on_casgn(node)
  report_error('can not define (or override) constants') unless Capataz.can_declare?(:constant)
  super
  capatize(node.children[2])
end
on_class(node) click to toggle source
Calls superclass method
# File lib/capataz/rewriter.rb, line 72
def on_class(node)
  report_error('can not define classes') unless Capataz.can_declare?(:class)
  super
end
on_cvar(_) click to toggle source
Calls superclass method
# File lib/capataz/rewriter.rb, line 112
def on_cvar(_)
  report_error('can not access class variables') unless Capataz.can_declare?(:cvar)
  super
end
on_cvasgn(_) click to toggle source
Calls superclass method
# File lib/capataz/rewriter.rb, line 107
def on_cvasgn(_)
  report_error('can not access class variables') unless Capataz.can_declare?(:cvar)
  super
end
on_def(node) click to toggle source
Calls superclass method
# File lib/capataz/rewriter.rb, line 82
def on_def(node)
  report_error('can not define methods') unless Capataz.can_declare?(:def)
  super
  insert_before(node.location.expression, ";::Capataz.denied_override_of(self, :#{node.children[0]});") unless Capataz.allow_method_overrides
end
on_gvar(_) click to toggle source
Calls superclass method
# File lib/capataz/rewriter.rb, line 117
def on_gvar(_)
  report_error('can not access global variables') unless Capataz.can_declare?(:gvar)
  super
end
on_gvasgn(_) click to toggle source
Calls superclass method
# File lib/capataz/rewriter.rb, line 122
def on_gvasgn(_)
  report_error('can not access global variables') unless Capataz.can_declare?(:gvar)
  super
end
on_ivar(_) click to toggle source
Calls superclass method
# File lib/capataz/rewriter.rb, line 102
def on_ivar(_)
  report_error('can not access instance variables') unless Capataz.can_declare?(:ivar)
  super
end
on_ivasgn(_) click to toggle source
Calls superclass method
# File lib/capataz/rewriter.rb, line 97
def on_ivasgn(_)
  report_error('can not access instance variables') unless Capataz.can_declare?(:ivar)
  super
end
on_lvasgn(node) click to toggle source
Calls superclass method
# File lib/capataz/rewriter.rb, line 67
def on_lvasgn(node)
  super
  capatize(node.children[1])
end
on_module(node) click to toggle source
Calls superclass method
# File lib/capataz/rewriter.rb, line 77
def on_module(node)
  report_error('can not define modules') unless Capataz.can_declare?(:module)
  super
end
on_return(node) click to toggle source
Calls superclass method
# File lib/capataz/rewriter.rb, line 55
def on_return(node)
  report_error('can not use return') unless Capataz.can_declare?(:return)
  super
  capatize(node.children[2])
end
on_self(_) click to toggle source
# File lib/capataz/rewriter.rb, line 88
def on_self(_)
  report_error('can not access to self') unless Capataz.can_declare?(:self)
end
on_send(node) click to toggle source
Calls superclass method
# File lib/capataz/rewriter.rb, line 33
def on_send(node)
  super
  unless Capataz.allows_invocation_of(method_name = node.children[1])
    report_error("invoking method #{method_name} is not allowed")
  end
  if (left = node.children[0])
    capatize(left)
  elsif node.type == :send
    unless @self_linker.link?(method_name)
      report_error("error linking #{method_name}")
    end if @self_linker
    (@logs[:self_sends] ||= Set.new) << method_name
    prefix = @self_send_prefixer ? @self_send_prefixer.prefix(method_name, @self_linker) : ''
    insert_before(node.location.expression, "::Capataz.handle(self).#{prefix}")
  end
  i = 2
  while i < node.children.length
    decapatize(node.children[i])
    i += 1
  end
end
on_yield(node) click to toggle source
Calls superclass method
# File lib/capataz/rewriter.rb, line 92
def on_yield(node)
  report_error('can not make yield calls') unless Capataz.can_declare?(:yield)
  super
end
rewrite(source_buffer, ast) click to toggle source
# File lib/capataz/rewriter.rb, line 17
def rewrite(source_buffer, ast)
  @logs.clear
  @capatized_nodes.clear
  @source_rewriter = Capataz::SourceRewriter.new(source_buffer)

  process(ast)

  @source_rewriter.preprocess
  @source_rewriter.process
end

Private Instance Methods

capatize(node, options = {}) click to toggle source
# File lib/capataz/rewriter.rb, line 137
def capatize(node, options = {})
  if node && !@capatized_nodes.include?(node)
    @capatized_nodes << node
    options[:constant] = true if node.type == :const
    @source_rewriter.insert_before_multi(node.location.expression, '::Capataz.handle(')
    if !options.empty?
      @source_rewriter.insert_after_multi(node.location.expression, ", #{options.to_a.collect { |item| "#{item[0]}: #{item[1]}" }.join(',')})")
    else
      @source_rewriter.insert_after_multi(node.location.expression, ')')
    end
  end
end
const_from(node) click to toggle source
# File lib/capataz/rewriter.rb, line 157
def const_from(node)
  if node
    const_from(node.children[0]) + '::' + node.children[1].to_s
  else
    ''
  end
end
decapatize(node) click to toggle source
# File lib/capataz/rewriter.rb, line 150
def decapatize(node)
  unless node.type == :hash
    @source_rewriter.insert_before_multi(node.location.expression, '(')
    @source_rewriter.insert_after_multi(node.location.expression, ').capataz_slave')
  end
end
report_error(message) click to toggle source
# File lib/capataz/rewriter.rb, line 129
def report_error(message)
  if @options[:halt_on_error]
    fail message
  else
    (logs[:errors] ||= []) << message
  end
end